アトミック操作の戻り値

C++11標準のアトミックライブラリでは、std::atomicというクラスが定義されています。
このクラスには、operator=、+=、-=のような演算子が定義されていますが、セオリーとは少し外れた設計になっているので、紹介したいと思います。


operator=は通常、以下のようなシグニチャで定義します。

template <class T>
class MyClass {
public:
    ...
    MyClass& operator=(T x);
};

通常は戻り値として、代入後の、自分自身のオブジェクトを返します。
しかし、atomicクラスはそうなっていません。atomicクラスの場合は、以下のようなシグニチャで定義されます。

template <class T>
class atomic {
public:
    ...
    T operator=(T x);
};

atomicクラスの代入演算子は、新たな値xを代入したあと、自身のオブジェクトではなく、代入した値を返します。
これは、自身のオブジェクトを返してしまうと、そのオブジェクトが持つ値を取得するために、並行処理を意識した上でload()関数を使用しなければならないからだと思われます。


operator+=、operator++といった他の演算子も、*thisではなく値を返します。


参照:
std::atomic - cpprefjp