假设我有一个结构体定义:
struct thing
{
thing* x;
int z;
thing() : x(this), z(0) {}
void foo() const
{
this->x->z++;
}
};
请注意,我创建了一个指向我自己的可变指针(邪恶的笑)
然后我可以像这样使用它:
int main()
{
const thing c;
c.foo();
assert(c.z == 1);
c.foo();
assert(c.z == 2);
return c.z;
}
正如你所看到的,我似乎可以改变一个常数值……这是UB吗?
[dcl.type.cv]p4:
除非任何班级成员声明mutable
([dcl.stc]) 可以是
已修改,任何修改尝试 ([expr.ass], [expr.post.incr],
[expr.pre.incr]) 在其期间是一个 const 对象 ([basic.type.qualifier])
生命周期 ([basic.life]) 会导致未定义的行为。
[基本.类型.限定符]p1:
A 常量对象是一个类型的对象const T
或此类对象的不可变子对象。
c.z
是一个const对象,因为它是一个不可变的子对象c
。您的代码尝试在其生命周期内对其进行修改。由此可见,该代码具有未定义的行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)