const_cast UB:澄清引用与对象/值

Per*_*-lk 6 c++

我知道这是未定义的行为(这里已经有其他问题在谈论这种情况):

int const i = 0;
int const& j = i;
const_cast<int&>(j) = 8;
Run Code Online (Sandbox Code Playgroud)

不过,我想这不是吧?

int i = 0;
int const& j = i;
const_cast<int&>(j) = 8;
Run Code Online (Sandbox Code Playgroud)

如果我没记错的话,UB 只修改const对象,而不管您用来引用它的引用的限定符如何。因此,删除对最初不是 const 的对象的引用的 const 限定符,然后写入它就可以了,对吗?

use*_*570 3

第二个片段的格式良好,因为我们只被禁止尝试修改i非 const 对象。该标准甚至有一个与您的示例基本相同的示例,只是它使用指针而不是引用。

来自dcl.dcl

任何在 const 对象 ([basic.type.qualifier]) 的生命周期 ([basic.life]) 期间修改 ([expr.ass]、[expr.post.incr]、[expr.pre.incr]) 的尝试都会导致结果在未定义的行为中。

int i = 2;
const int* cip; 
cip = &i;
int* ip;
ip = const_cast<int*>(cip); 
*ip = 4; // defined: *ip points to i, a non-const object
Run Code Online (Sandbox Code Playgroud)

需要注意的重要一点是,上面的内容定义良好,因为i它是非常量的,就像第二个代码片段中一样。