3

看完You don't know const and mutable后,我有点疑惑mutable以后如何正确处理。虽然我认为这种情况const非常安全,因为默认情况下会假定物理只读(减去旧的逻辑异常),正确处理mutable让我感到困惑。例如,对于新的线程安全条件,以下似乎是错误的:

int main() {
    int n;
    [=]() mutable {n = 10;}();
    return n;
}

我会假设,在这种情况下,n必须以另一种方式将其包装到 a 或受并发写入保护std::atomic的副本中!?n

4

1 回答 1

1

如果我们明确地写出 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,它正在从未初始化的变量中读取。我在这里对其进行了初始化以修复那个小错误。)

如您所见,您没有可变成员,因此无需更改任何内容以实现线程安全(根据谈话)。只是一个可以通过非常量成员函数改变的常规成员变量;不假定非常量成员函数是线程安全的。

我不知道您是否可以将 lambda 成员标记为mutable; 如果可以的话,您可能处于需要关注线程安全的位置(加上 const 函数调用运算符)。但我不认为这是可能的。

于 2013-02-21T22:28:00.947 回答