为什么可以通过使用指向对象成员的指针的 const 成员函数来修改对象状态?

Why is it possible to modify object state via const member function that uses pointer to the object's member?

为什么这段代码没有产生编译错误:

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 对象的值是未定义的行为。引用 cppreference:

Modifying a const object through a non-const access path and referring to a volatile object through a non-volatile glvalue results in undefined behavior.

并引用 [dcl.type.cv]/4

Except that any class member declared mutable can be modified, any attempt to modify a const object during its lifetime results in undefined behavior.