3
// 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只为指针工作?我怎样才能使第二种情况编译?

4

2 回答 2

10

const_cast作用于指针和引用,删除constvolatile限定符。使用它来强制转换为对象类型是没有意义的,因为那时您将制作一个不需要与原始文件具有相同 cv 限定符的副本。

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

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

但是,使用该引用会产生未定义的行为,因为底层对象是它本身volatileconst_cast仅当您知道基础对象不具有这些资格时(或者在删除的情况下const,当您知道结果不会用于修改对象时)才应该使用删除资格。

只有当对象允许复制 volatile 对象时,您才能获得副本(可能使用复制构造函数采用对 volatile 或 volatile 限定的函数或转换运算符)。如果CString不提供任何这些,那么您就不能安全地复制volatile该类型的对象。

于 2011-11-18T11:20:56.470 回答
0

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

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

const CString &b1 = b0;
于 2011-11-18T11:16:48.670 回答