不断变化的价值观

Dar*_*bik 11 c++ const undefined-behavior

假设我有一个结构定义:

struct thing
{
    thing* x;
    int z;

    thing() : x(this), z(0) {}
    void foo() const
    {
        this->x->z++;
    }
};
Run Code Online (Sandbox Code Playgroud)

请注意,我创建了一个指向自己的可变指针(邪恶的笑)

然后我可以像这样使用它:

int main()
{
    const thing c;
    c.foo();
    assert(c.z == 1);
    c.foo();
    assert(c.z == 2);
    return c.z;
}
Run Code Online (Sandbox Code Playgroud)

而且你可以看到我似乎可以改变一个恒定的值......这是UB吗?

T.C*_*.C. 10

[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.您的代码尝试在其生命周期内对其进行修改.因此,代码具有未定义的行为.