アトミックオブジェクトを含むクラスのコピーとムーブ

C++11: write move constructor with atomic<bool> member?


std::atomicクラスはコピーコンストラクタとムーブコンストラクタがdelete定義されるので、std::atomicクラスのオブジェクトをメンバ変数に持つクラスは、コピーコンストラクタとムーブコンストラクタが自動定義されません。

#include <atomic>
#include <utility>

struct X {
    std::atomic<int> value;
};

int main()
{
    X x1;
    X x2 = x1; // エラー!
    X x3 = std::move(x1); // エラー!
}

このようなクラスをコピー/ムーブしたい場合は、自分でコピーコンストラクタとムーブコンストラクタを定義し、アトミックオブジェクトからloadした値をコピーする必要があります。

#include <atomic>
#include <utility>

struct X {
    std::atomic<int> value;

    X() {}
    X(const X& x)
        : value(x.value.load()) {}

    X(X&& x)
        : value(x.value.load())
    {
        // 必要であればx.valueを無効な値にする
    }
};

int main()
{
    X x1;
    X x2 = x1; // OK
    X x3 = std::move(x1); // OK
}

参照:
std::atomic - cpprefjp