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

7 c++ const-cast

为什么如下?:

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

  int       i3 = 5;
//const int i4 = const_cast<const int>(i3); // compilation error
  const int i5 = (const int)i3;             // okay
Run Code Online (Sandbox Code Playgroud)

Joh*_*itb 20

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

  int       i3 = 5;
//const int i4 = const_cast<const int>(i3); // compilation error
  const int i5 = (const int)i3;             // okay
Run Code Online (Sandbox Code Playgroud)

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

int i1 = i0;
const int i4 = i3;
Run Code Online (Sandbox Code Playgroud)

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

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

  int       i3 = 5;
//const int&i4 = const_cast<const int&>(i3); // ok now and valid!
  const int&i5 = (const int&)i3;             // okay too!
Run Code Online (Sandbox Code Playgroud)

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


Rob*_*edy 5

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

  • 指针
  • 参考
  • 会员三分球

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

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


Jar*_*Par 1

对于第一个错误。const_cast 只能用于指针或引用类型。“int”两者都不是。这可能是也可能不是 C++ 标准(找不到好的参考)。但某些实现(例如 MS 的 C++ 编译器)就是这种情况。

对于第二个错误。const_cast 只能用于删除 const 或 volatile 限定符,而不能添加它。

参考:http://msdn.microsoft.com/en-us/library/bz6at95h (VS.80).aspx

  • const_cast 运算符(仅限 C++) const_cast 运算符用于向类型添加或删除 const 或 volatile 修饰符。来自:http://publib.boulder.ibm.com/infocenter/compbgpl/v9v111/index.jsp?topic=/com.ibm.xlcpp9.bg.doc/language_ref/keyword_const_cast.htm (2认同)