为什么如下?:
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,你可能会也写入它,然后产生未定义的行为)
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,你可能会也写入它,然后产生未定义的行为)
这是一个错误,因为标准说这是不允许的.该标准枚举了const_cast
允许执行的转换类型,并且不允许列表中没有的任何内容.它允许以下内容:
指针
参考
会员三分球
由于您的类型不是任何类型,因此不允许使用.
从好的方面来看,你提供的例子也不需要 const_cast
.