【问题标题】:Why is it possible to modify object state via const member function that uses pointer to the object's member?为什么可以通过使用指向对象成员的指针的 const 成员函数来修改对象状态?
【发布时间】:2021-06-04 21:58:26
【问题描述】:

为什么这段代码不会产生编译错误:

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 的应用有关。 int &i() const 上的 const 意味着 i() 不能修改调用它的对象的成员。它还允许为c 调用c.i(),即const.. 但是,返回类型int & 意味着c.i() 返回一个非constint 的引用,所以底层int 可以修改。为防止这种修改,请执行const int& i() const { return *ptr; }
  • 您将无法更改指针值。您将能够更改指针指向的值。你黑了自己。

标签: c++ function class constants member


【解决方案1】:

在对象的构造和销毁期间,成员不是 const。这意味着您可以存储一个非常量指针,该指针指向一个在构造对象后将变为 const 的成员。使用该指针更改 const 对象的值是未定义的行为。引用cppreference:

通过非常量访问路径修改 const 对象并通过非易失性左值引用易失性对象会导致未定义的行为。

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

除了任何声明为 mutable 的类成员都可以修改之外,任何在 const 对象的生命周期内修改它的尝试都会导致未定义的行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    • 2013-04-21
    • 1970-01-01
    相关资源
    最近更新 更多