作者:mobiledu2502854077 | 来源:互联网 | 2022-12-02 18:19
假设我有一个结构定义:
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吗?
1> T.C...:
[dcl.type.cv] P4:
除了mutable
可以修改任何声明的类成员([dcl.stc])之外,任何修改([expr.ass],[expr.post.incr],[expr.pre.incr])const对象的尝试([basic] .type.qualifier])在其生命周期内([basic.life])导致未定义的行为.
[basic.type.qualifier] P1:
甲const对象是类型的对象const T
或这样的对象的非易变的子对象.
c.z
是一个const对象,因为它是一个不可变的子对象c
.您的代码尝试在其生命周期内对其进行修改.因此,代码具有未定义的行为.