众所周知,UB 会从真实常量中删除常量
const int i = 0;
const_cast<int&>(i) = 42; // ub
但是,当您处理对非 const 的 const 引用时,这样做是完全可以的
int i = 0;
const int &ri = i;
const_cast<int&>(ri) = 42; // ok
cppreference 表示 以下
const 对象是
- 类型为 const 限定的对象,或
- const 对象的不可变子对象。
此类物体不能 修改:尝试直接这样做是一个编译时错误,并且 尝试间接这样做(例如,通过修改 const 对象 通过引用或指向非常量类型的指针)导致未定义 行为。
非 const 实例的 const 字段是否是“const 对象”?
struct Foo {
const int c = 0;
};
Foo f = {13};
const_cast<int&>(f.c) = 42; // ???
是的,是
const
。您的字段是 const int
。当初是这样宣布的,现在也是这样。事实上,它存在于一个 may 也具有非 const
字段的对象中是无关紧要的。正如参考文档所述,尝试(直接或间接)修改该字段是未定义的行为。