为什么此代码不会产生编译器错误:
class C
{
int _i{ 123 };
int* ptr{ &_i };
public:
int& i() const { return *ptr; }
};
int main()
{
C const c;
c.i() += 321;
return c.i();
}
标准中有关于这种行为的一些文字吗?当然,也许没有必要指向可以直接访问的成员,但是在堆上拥有也可以被视为对象一部分的资源呢?
在对象的构造和销毁过程中,成员不是 const。这意味着您可以存储一个指向在构造对象后将成为 const 的成员的非常量指针。使用该指针更改 const 对象的值是未定义的行为。引用参考参数:
通过非常量访问路径修改常量对象并通过非易失性左值引用易失性对象会导致未定义的行为。
并引用[dcl.type.cv]/4:
除了声明为可变的任何类成员都可以修改之外,任何在其生命周期内修改 const 对象的尝试都会导致未定义的行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)