为什么如下?:
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,你可能会也写入它,然后产生未定义的行为)
这是一个错误,因为标准说这是不允许的.该标准枚举了const_cast
允许执行的转换类型,并且不允许列表中没有的任何内容.它允许以下内容:
由于您的类型不是任何类型,因此不允许使用.
从好的方面来看,你提供的例子也不需要 const_cast
.
对于第一个错误。const_cast 只能用于指针或引用类型。“int”两者都不是。这可能是也可能不是 C++ 标准(找不到好的参考)。但某些实现(例如 MS 的 C++ 编译器)就是这种情况。
对于第二个错误。const_cast 只能用于删除 const 或 volatile 限定符,而不能添加它。
参考:http://msdn.microsoft.com/en-us/library/bz6at95h (VS.80).aspx
归档时间: |
|
查看次数: |
9578 次 |
最近记录: |