当前位置:  开发笔记 > 编程语言 > 正文

C++ const_cast用法而不是C风格的强制转换

如何解决《C++const_cast用法而不是C风格的强制转换》经验,为你挑选了2个好方法。

为什么如下?:

  const int i0 = 5;
//int       i1 = const_cast(i0);       // compilation error
  int       i2 = (int)i0;                   // okay

  int       i3 = 5;
//const int i4 = const_cast(i3); // compilation error
  const int i5 = (const int)i3;             // okay

Johannes Sch.. 20

  const int i0 = 5;
//int       i1 = const_cast(i0);       // compilation error
  int       i2 = (int)i0;                   // okay

  int       i3 = 5;
//const int i4 = const_cast(i3); // compilation error
  const int i5 = (const int)i3;             // okay

编译错误是由于您没有强制转换const/add const引起的.相反,你复制i0.对于该操作,根本不需要演员:

int i1 = i0;
const int i4 = i3;

您投射到的类型实际上应该是指针或引用.否则,使用const_cast没有意义,因为你可以直接复制它.为指针,例如,可以丢掉的常量,因为访问指针将产生另一种类型的用于const T*(产率const T)高于对T*(产率T).对于引用,也是如此:T&将访问使用另一个对象这种指针类型比使用const T&.现在您真正想要存档的内容:

  const int i0 = 5;
//int &     i1 = const_cast(i0);      // okay (but dangerous)
  int &     i2 = (int&)i0;                  // okay (but dangerous)

  int       i3 = 5;
//const int&i4 = const_cast(i3); // ok now and valid!
  const int&i5 = (const int&)i3;             // okay too!

当你通过对非const的引用写入一个原始的const对象时,上面会导致未定义的行为(实际上,只是转换和读取它本身并不是未定义的行为.但是如果你抛弃const,你可能会也写入它,然后产生未定义的行为)



1> Johannes Sch..:
  const int i0 = 5;
//int       i1 = const_cast(i0);       // compilation error
  int       i2 = (int)i0;                   // okay

  int       i3 = 5;
//const int i4 = const_cast(i3); // compilation error
  const int i5 = (const int)i3;             // okay

编译错误是由于您没有强制转换const/add const引起的.相反,你复制i0.对于该操作,根本不需要演员:

int i1 = i0;
const int i4 = i3;

您投射到的类型实际上应该是指针或引用.否则,使用const_cast没有意义,因为你可以直接复制它.为指针,例如,可以丢掉的常量,因为访问指针将产生另一种类型的用于const T*(产率const T)高于对T*(产率T).对于引用,也是如此:T&将访问使用另一个对象这种指针类型比使用const T&.现在您真正想要存档的内容:

  const int i0 = 5;
//int &     i1 = const_cast(i0);      // okay (but dangerous)
  int &     i2 = (int&)i0;                  // okay (but dangerous)

  int       i3 = 5;
//const int&i4 = const_cast(i3); // ok now and valid!
  const int&i5 = (const int&)i3;             // okay too!

当你通过对非const的引用写入一个原始的const对象时,上面会导致未定义的行为(实际上,只是转换和读取它本身并不是未定义的行为.但是如果你抛弃const,你可能会也写入它,然后产生未定义的行为)



2> Rob Kennedy..:

这是一个错误,因为标准说这是不允许的.该标准枚举了const_cast允许执行的转换类型,并且不允许列表中没有的任何内容.它允许以下内容:

指针

参考

会员三分球

由于您的类型不是任何类型,因此不允许使用.

从好的方面来看,你提供的例子也不需要 const_cast.

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有