const_cast 是 C++ 中的一种特殊类型转换运算符,它允许移除或添加指针或引用上的 const/volatile 限定符。最常见的用法是在将对象传递给期望非const类型的函数时,原始对象已被定义为带有 const 修饰符。
使用:
const T& 全局变量),尝试在去掉const后进行写入会导致未定义的行为。void foo(int* p) { *p = 42; } void bar(const int* q) { // 只有当源对象不是const时,才能去掉const! foo(const_cast<int*>(q)); }
如果在 bar 中传递了指向 int 的指针,可以安全地去掉const。如果是 const int,将在写入时出现未定义行为。
mutable。“是否可以通过const_cast去掉对象的const,前提是它是一个字面量或仅在只读内存段内?这有什么后果?”
回答: 可以去掉指针或引用上的const属性,但如果尝试修改字面量或放置在“只读”段中的值(例如,字符串字面量、静态const),将会导致未定义行为——这可能导致崩溃或忽略写入。
示例:
const char* str = "hello"; char* p = const_cast<char*>(str); p[0] = 'H'; // UB: 字符串字面量在只读内存中!
故事
在项目中移除了字段的const修饰符,然后在这些字段上进行了写入,未意识到传递的值实际上是const(全局常量),——在某些平台上应用程序出现了段错误。
故事
代码中使用const_cast绕过了没有mutable修饰符的const方法:在const方法内部修改了类的字段,导致在并发访问时出现难以发现的错误。
故事
对STL容器对象的不正确const_cast(例如,const std::vector),随后修改了容器——这并不总是立即引发错误,但会导致在后续操作中发生不可预测的行为。