为什么const_cast away volatile只对指针有效?
Why const_cast away volatile only work for pointer
// 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
作用于指针和引用,去除const
和volatile
限定符。使用它来强制转换为对象类型是没有意义的,因为这样你将创建一个副本,而该副本不需要具有与原始副本相同的cv-限定符。
如果转换为非易失性引用:
,则第二个示例可以编译。volatile CString b0;
CString & b1 = const_cast<CString &>(b0);
然而,使用该引用会产生未定义的行为,因为底层对象本身就是volatile
。只有当知道底层对象不具有这些限定条件时,才应该使用const_cast
来删除限定条件(或者在删除const
的情况下,当知道结果不会用于修改对象时)。
只有在对象允许复制volatile对象的情况下才能获得副本(可能使用接受对volatile的引用或volatile限定函数或转换操作符的复制构造函数)。如果CString
不提供这些,那么就不能安全地复制该类型的volatile
对象。
因为在第二种情况下,你实际上是在复制b0
而不是引用原始对象
在这种情况下你需要做一个引用
const CString &b1 = b0;
相关文章:
- 调整大小后指向元素值的指针unordered_map有效?
- 如何在工厂方法中返回指向基于基础操作系统的派生类的有效指针
- 为什么在引用指针时将 const 放在 & 符号的左侧有效,而在右侧则无效?
- C++ 返回指向函数内定义的静态数组的指针是否有效?
- 通过指针调用模板类成员函数 [为什么这是有效的 c++]?
- free():在有效指针异常中-使用流读取巨大文件时
- 释放 std::vector 中指针内存的最有效方法是什么?
- C++ 常量指向文字的指针有效吗?
- 是否存在将长整型转换为指针有效的情况
- 将指针传递给函数在简单的情况下有效,但在"class" -izing 之后不起作用
- 在映射中插入更多元素后,指向 QMap 中元素的指针是否仍然有效?
- 指向派生类的指针中的"static_cast<Base*>(static_cast<void*>(派生))"何时有效?
- 如何有效地使用 std::async 对指针数组执行操作
- 当程序从该函数调谐器时,指向在函数中声明和定义的某些 C 字符串的指针不再有效.为什么?
- EIGEN地图类:将C阵列映射到VectorXD指针以有效的方式
- 如何检查指针后面的对象是否有效或已删除?
- C++数组超出范围访问以计算指针有效?
- 提升::进程间managed_shared_memory指针有效作用域
- 为什么const_cast away volatile只对指针有效?
- 为什么将const类型的智能指针强制转换为类型的智能指针有效?