看完You don't know const and mutable之后,我有点困惑将来如何正确处理mutable
。
虽然我认为const
的情况非常安全,但是由于默认情况下会假定物理只读(减去旧的逻辑异常),因此正确处理mutable
会让我感到困惑。
例如,对于新的线程安全条件,以下情况似乎是错误的:
int main() {
int n;
[=]() mutable {n = 10;}();
return n;
}
我假设在这种情况下,必须将
n
包装到std::atomic
中,或者通过另一种方式通过并发写入来保护n
的副本! 最佳答案
如果我们将lambda明确写出,对您来说可能更清楚:
struct mylambda
{
mylambda(int n) : n(n) {}
void operator()() /* const <- lambda specified as mutable, operator not const */
{
n = 10;
}
private:
int n;
};
int main() {
int n = 0;
mylambda(n)();
return n;
}
(旁注:您的示例中实际上有未定义的行为,因为当您的lambda复制
n
时,它是从未初始化的变量读取的。我在这里已对其进行了初始化,以修复该小错误。)如您所见,您没有可变成员,因此无需更改任何内容以确保线程安全(根据讨论)。只是可以通过非const成员函数进行更改的常规成员变量;非常量成员函数不被认为是线程安全的。
我不知道您是否可以将lambda成员标记为
mutable
;如果可以的话,您可能处在线程安全受到关注的位置(与const函数调用运算符一起使用)。但是我认为这是不可能的。