我知道这是未定义的行为(这里已经有其他问题在谈论这种情况):
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 限定符,然后写入它就可以了,对吗?
第二个片段的格式良好,因为我们只被禁止尝试修改i非 const 对象。该标准甚至有一个与您的示例基本相同的示例,只是它使用指针而不是引用。
来自dcl.dcl。
任何在 const 对象 ([basic.type.qualifier]) 的生命周期 ([basic.life]) 期间修改 ([expr.ass]、[expr.post.incr]、[expr.pre.incr]) 的尝试都会导致结果在未定义的行为中。
Run Code Online (Sandbox Code Playgroud)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
需要注意的重要一点是,上面的内容定义良好,因为i它是非常量的,就像第二个代码片段中一样。