具体来说,标准在哪里规定修改 const 对象是未定义的行为?



以下示例众所周知表现出未定义的行为:

T const x = T();
T& r = any_suitable_conversion_to_Tref(x); // fine
r = T(); // UB

这已通过 cpp 首选项确认const_cast

const_cast可以形成对实际引用 const 对象的非 const 类型的引用或指针,或者形成对实际引用可变对象的非易失性类型的引用或指针。通过非常量访问路径修改 const 对象并通过非 const glvalue 引用易失性对象会导致未定义的行为。

但是,它没有提到例如 c 样式转换,也没有引用标准(cpp首选项通常从不引用

(。C++标准究竟在哪里禁止这样做?

C++17 标准在[dcl.type.cv]10.1.7 下的第 10 章"声明"中声明:

  1. 除了可以修改声明mutable(10.1.1( 的任何类成员之外,任何在const对象的生存期 (6.8( 期间修改其尝试都会导致未定义的行为。

最新更新