3

見た後const と mutable を知らないあなたはmutable、今後適切に処理する方法に少し困惑しています。constの場合はかなり安全だと思いますが、デフォルトで物理的な読み取り専用 (古いロジックの例外を差し引いたもの) を想定しているため、適切に処理することはmutable私を困惑させます。たとえば、新しい threadsafe-condition では、次は間違っているようです。

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

この場合、別の方法で同時書き込みによって保護されるか、またはのコピーにnラップする必要があると思います!?std::atomicn

4

1 に答える 1

1

ラムダを明示的に書き出すと、より明確になるかもしれません。

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;
}

(補足:ラムダがコピーするときn、初期化されていない変数から読み取っているため、この例では実際には未定義の動作があります。その小さなエラーを修正するためにここで初期化しました。)

ご覧のとおり、変更可能なメンバーがないため、スレッドセーフにするために何も変更する必要はありません (トークによると)。非 constメンバー関数を介して変更できる単なる通常のメンバー変数。非 const メンバ関数は、スレッド セーフであると想定されていません。

mutableラムダメンバーを;としてマークできるかどうかわかりません。可能であれば、スレッドの安全性が懸念される立場にある可能性があります (const 関数呼び出し演算子と組み合わせて)。しかし、それは不可能だと思います。

于 2013-02-21T22:28:00.947 に答える