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

标签 c++ function class constants 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.

关于c++ - 为什么可以通过使用指向对象成员的指针的 const 成员函数来修改对象状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66505784/

相关文章:

function - 如果范围内的数字总和等于 1,则对数字进行分组

c++ - 是否值得使用位移位将多个小数据成员存储在一个字节中?

c++ - 如何在 C++ 中更改二维数组中数字的位置?

c++ - 谁能帮我解决 C++ 中的 if 语句和字符串?

list - Haskell:在元组列表中组合整数

python-3.x - 在 Jupyter 中调用定义的函数时出现名称错误

java - 创建传递的 Class.class 参数的新实例

C++ 指针运行时错误 - 使用指针设置变量然后检索

c++ - 如何在 MFC 项目中打开 GDI+ 1.1 而不是 1.0?

c++ - 父类(super class)的模板 friend