在什么意义上 const 只允许对可变成员变量进行原子更改?

Enr*_*lis 4 c++ constants atomic mutable language-lawyer

我正在阅读Ivan ?uki 的C++ 函数式编程,我很难解释第 5 章总结中的一点:

  • 当您创建成员函数时const,您承诺该函数不会更改类中的任何数据(对象的任何部分都不会更改),或者对对象(声明为 的成员mutable)的任何更改都将是原子的作为对象的用户而言

如果部分斜体简单地被限制在声明成员为mutable我会很高兴吧。然而,我的这种改写似乎与作者在括号中的内容一致。括号外是什么让我感到困惑:那句话中原子的含义是什么?

Bri*_*ian 7

作者声明的是最佳实践,而不是语言规则。

可以编写一个类,其中const方法mutable以用户可见的方式更改成员,如下所示:

struct S {
    mutable int value = 0;
    int get() const {
        return value++;
    }
};
const S s;
std::cout << s.get();  // prints 0
std::cout << s.get();  // prints 1
// etc
Run Code Online (Sandbox Code Playgroud)

你可以这样做,而且它不会违反任何语言规则。但是,你不应该。它违反了用户的期望,即该const方法不应以可观察的方式更改内部状态。

mutable成员有合法的用途,例如可以加速const成员函数的后续执行的记忆。

作者建议,作为最佳实践,成员函数对mutable成员的这种使用应该是原子的,因为用户可能期望两个不同的线程可以同时调用对象上的成员函数。constconst

如果您违反了此准则,那么您并没有直接违反语言的任何规则。但是,这使得用户很可能会以导致数据竞争(这是未定义的行为)的方式使用您的类。它剥夺了用户使用const限定符来推理类的线程安全性的能力。