关于const_cast未定义行为的澄清:引用与对象/值的区别
关于const_cast修改引用的行为判定
你的判断完全正确,第二段代码不属于未定义行为,你的理解也是准确的。
核心逻辑拆解
- C++标准明确:只有当修改的对象本身被声明为const时,才会触发未定义行为,这和引用的const限定符没有直接关联。
- 两段代码的本质差异:
- 第一段代码里,
i是const int类型,属于const对象。哪怕通过const_cast去掉引用j的const限定去赋值,本质还是在修改一个const对象,因此属于未定义行为。 - 第二段代码里,
i是普通int类型,本身具备可修改属性。const int& j = i只是限制了通过引用j不能直接修改i,但i的可修改本质没有改变。用const_cast<int&>(j)去掉引用的const限定后,赋值操作本质是对原始的非const对象i进行修改,这是符合C++标准的合法操作,执行后i的值会被修改为8。
- 第一段代码里,
内容的提问来源于stack exchange,提问作者ABu
相关产品推荐
相关产品推荐

