告诉我,我正在阅读有关 const_cast 的信息。编写的 const_cast 允许您删除 const 或 volatile 变量的状态。但它似乎并不完全是字面意思:因为我不能将它视为一个成熟的变量:
const int i = 0;
const_cast<int*>(&i);
i = 555;
但我可以这样做:
const int i = 0;
int* j = const_cast<int*>(&i);
*j = 555;
也就是说,如果声明了 const int i = 0; ,那么在 const_cast i 之后只能使用指针更改?
const
无论如何,分配给已定义为UB(未定义行为)的对象。const_cast
绝不会从对象本身中删除常量,它只会“返回”具有所需类型的传递给它的值(该表达式也可以“赋值”(l-value))。在实践
const_cast
中,它很少使用。将 const 对象传递给显然不会更改它(但接受非 const 引用/指针)的函数,或者相反,更改已知为非 const 但由 const 传递的对象通常是一种相对肮脏的技巧参考/指针。以一种简单的方式,它看起来像这样:关于一个直接的问题:从语法的角度来看,您可以将常量变量转换为非常量引用(当然,您不应该这样做):
const_cast
不会改变变量本身。它只是返回您传递给它的指针,重新输入:您将它传递给const int *
,输出int *
是 ,指向同一个变量。当然,如果你不使用这个演员返回的东西,那么它根本不会做任何事情。
您的第二个示例虽然可以编译,但也是不正确的(导致未定义的行为),因为您正在修改 const 变量。
const_cast
如果您以某种方式只有一个指向常量(或常量引用)的指针,则只能用于修改非常量变量。例子: