为什么const_cast away volatile只对指针有效?

Why const_cast away volatile only work for pointer

本文关键字:指针 有效 volatile const cast away 为什么      更新时间:2023-10-16
// 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只适用于指针?我如何使第二个案例进行编译?

const_cast作用于指针和引用,去除constvolatile限定符。使用它来强制转换为对象类型是没有意义的,因为这样你将创建一个副本,而该副本不需要具有与原始副本相同的cv-限定符。

如果转换为非易失性引用:

,则第二个示例可以编译。
volatile CString b0;
CString & b1 = const_cast<CString &>(b0);

然而,使用该引用会产生未定义的行为,因为底层对象本身就是volatile。只有当知道底层对象不具有这些限定条件时,才应该使用const_cast来删除限定条件(或者在删除const的情况下,当知道结果不会用于修改对象时)。

只有在对象允许复制volatile对象的情况下才能获得副本(可能使用接受对volatile的引用或volatile限定函数或转换操作符的复制构造函数)。如果CString不提供这些,那么就不能安全地复制该类型的volatile对象。

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

在这种情况下你需要做一个引用

const CString &b1 = b0;