为什么const_cast远离volatile只能用于指针

时间:2011-11-18 11:13:13

标签: c++ pointers volatile const-cast

// OK!
volatile CString* a0;
CString* a1 = const_cast<CString *>(a0);

// error C2440: 'const_cast' : cannot convert from 'volatile CString' to 'CString'
volatile CString b0;
CString b1 = const_cast<CString>(b0);

我在想,为什么const_cast只适用于指针?如何编写第二个案例?

2 个答案:

答案 0 :(得分:9)

const_cast对指针和引用执行操作,以删除constvolatile限定符。使用它来转换为对象类型是没有意义的,因为那样你就可以创建一个副本,无论如何都不需要与原始版本具有相同的cv限定符。

如果你转换为非易失性引用,你的第二个例子将被编译:

volatile CString b0;
CString & b1 = const_cast<CString &>(b0);

但是,使用该引用会给出未定义的行为,因为底层对象本身就是volatile。当您知道基础对象没有这些资格时(或者在删除const_cast的情况下,当您知道时),您应该只使用const来移除资格结果不会用于修改对象。)

如果对象允许复制易失性对象(可能是复制构造函数采用参考易失性或易失性限定函数或转换运算符),则只能获得副本。如果CString未提供任何此类内容,则您无法安全地复制该类型的volatile对象。

答案 1 :(得分:0)

因为在第二种情况下,您实际上是在复制b0而不是指原始对象

在这种情况下你需要做一个参考

const CString &b1 = b0;