非常量对象的const字段可以被const_cast-ed吗?

问题描述 投票:0回答:1

众所周知,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; // ???

c++ casting constants undefined-behavior
1个回答
1
投票

是的,是

const
。您的字段是
const int
。当初是这样宣布的,现在也是这样。事实上,它存在于一个 may 也具有非
const
字段的对象中是无关紧要的。正如参考文档所述,尝试(直接或间接)修改该字段是未定义的行为

© www.soinside.com 2019 - 2024. All rights reserved.