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
编译错误是因为您没有将 const 丢弃/添加 const。相反,您复制 i0。对于该操作,根本不需要强制转换:
int i1 = i0;
const int i4 = i3;
您转换为的类型实际上应该是指针或引用。否则,使用 const_cast 没有意义,因为您可以直接复制它。例如,对于指针,您可以抛弃 const,因为取消引用指针会为 a const T*
(yields const T
) 产生另一种类型,而不是 a T*
(yields T
)。对于引用,同样如此:T&
将使用另一种this指针类型而不是使用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!
以上可能导致未定义的行为,当您通过对非 const 的引用写入原始 const 对象时(实际上,仅转换和读取它本身并不是未定义的行为。但是如果您要丢弃 const,您可能也写入它,然后产生未定义的行为)