深入理解C++ 类型转换<三>const_cast
const_cast是 C 中四种命名的强制类型转换之一另外三种是static_cast、dynamic_cast和reinterpret_cast。它的唯一职责是添加或移除变量的const或volatile限定符。它不能改变对象的类型也不能做其他任何转换。语法const_castnew_type(expression)其中new_type必须是指针或引用类型且与expression的类型在去除const/volatile后必须一致。主要用途移除const最常见将const T*转为T*或const T转为T从而允许修改原本只读的对象但前提是对象本身不是常量。添加const较少用将T*转为const T*或T转为const T用于重载决议或接口适配。重要注意事项未定义行为UB如果用const_cast移除一个真正 const 对象的常量性并试图修改它则行为是未定义的程序可能崩溃或产生不可预测结果。只有当一个对象本身不是 const例如栈上的非 const 变量但被一个 const 指针或引用指向时才可以通过const_cast安全地修改它。只能用于指针或引用不能直接对对象本身使用只能对指针或引用。不能改变底层类型例如不能将int*转为char*那是reinterpret_cast的工作。风险提示滥用const_cast会破坏 const 正确性增加代码维护难度。它通常用于与遗留 C 库交互或解决设计上的妥协应尽量避免。例子1 安全使用#include iostream int main() { int value 42; // 非 const 对象 const int* const_ptr value; // const 指针指向它 // 通过 const_cast 移除 const得到可修改的指针 int* mutable_ptr const_castint*(const_ptr); *mutable_ptr 100; // 安全因为 value 本身不是 const std::cout value value std::endl; // 输出 100 return 0; }例子2不安全使用对象本身是常量#include iostream int main() { const int const_value 42; // 真正的 const 对象 const int* const_ptr const_value; // 移除 const 并尝试修改 int* mutable_ptr const_castint*(const_ptr); *mutable_ptr 100; // 未定义行为可能崩溃 std::cout const_value const_value std::endl; // 可能输出 42 或 100或崩溃 return 0; }例子3添加const的例子少见#include iostream void print(const int* p) { std::cout *p std::endl; } int main() { int value 42; int* p value; // 添加 const使非常量指针可以传递给期望 const 指针的函数 print(const_castconst int*(p)); // 也可以隐式转换此处仅演示 return 0; }