可变函子是否仍"valid"使用

Is mutable functor still "valid" to be used

本文关键字:valid 使用 是否      更新时间:2023-10-16

看完你不知道const和mutable我有点困惑如何正确处理mutable在未来。虽然我认为const的情况非常安全,因为默认情况下会假设物理只读(减去旧的逻辑异常),但正确处理mutable令我困惑。例如,对于新的threadsafe-condition,下面的语句似乎是错误的:

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

我认为,在这种情况下,n必须包装成std::atomicn的副本以另一种方式受并发写保护!?

如果我们明确地将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成员函数进行更改;非const成员函数不被认为是线程安全的。

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