看完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函数调用运算符一起使用)。但是我认为这是不可能的。

10-06 07:53