Enr*_*lis 4 c++ constants atomic mutable language-lawyer
我正在阅读Ivan ?uki 的C++ 函数式编程?,我很难解释第 5 章总结中的一点:
- 当您创建成员函数时
const,您承诺该函数不会更改类中的任何数据(对象的任何部分都不会更改),或者对对象(声明为 的成员mutable)的任何更改都将是原子的作为对象的用户而言。
如果部分斜体简单地被限制在声明成员为mutable我会很高兴吧。然而,我的这种改写似乎与作者在括号中的内容一致。括号外是什么让我感到困惑:那句话中原子的含义是什么?
作者声明的是最佳实践,而不是语言规则。
您可以编写一个类,其中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限定符来推理类的线程安全性的能力。
| 归档时间: |
|
| 查看次数: |
290 次 |
| 最近记录: |