名前空間
変種
操作

std::atomic::operator+=,-=,&=,|=,^=

提供: cppreference.com
< cpp‎ | atomic‎ | atomic
 
 
 
 
atomic<整数型>(C++11) および atomic<浮動小数点型>(C++20) テンプレート特殊化のみのメンバ
(1)
T operator+=( T arg ) noexcept;
T operator+=( T arg ) volatile noexcept;
atomic<T*> テンプレート特殊化のみのメンバ
(1)
T* operator+=( std::ptrdiff_t arg ) noexcept;
T* operator+=( std::ptrdiff_t arg ) volatile noexcept;
atomic<整数型>(C++11) および atomic<浮動小数点型>(C++20) テンプレート特殊化のみのメンバ
(2)
T operator-=( T arg ) noexcept;
T operator-=( T arg ) volatile noexcept;
atomic<T*> テンプレート特殊化のみのメンバ
(2)
T* operator-=( std::ptrdiff_t arg ) noexcept;
T* operator-=( std::ptrdiff_t arg ) volatile noexcept;
atomic<整数型> テンプレート特殊化のみのメンバ
(3)
T operator&=( T arg ) noexcept;
T operator&=( T arg ) volatile noexcept;
(4)
T operator|=( T arg ) noexcept;
T operator|=( T arg ) volatile noexcept;
(5)
T operator^=( T arg ) noexcept;
T operator^=( T arg ) volatile noexcept;

直前の値と arg から計算した結果で現在の値をアトミックに置き換えます。 この操作は読み込み-変更-書き込み操作です。

1) アトミックな加算を行います。 fetch_add(arg) + arg と同等です。
2) アトミックな減算を行います。 fetch_sub(arg) - arg と同等です。
3) アトミックなビット単位の論理積を行います。 fetch_and(arg) & arg と同等です。
4) アトミックなビット単位の論理和を行います。 fetch_or(arg) | arg と同等です。
5) アトミックなビット単位の排他的論理和を行います。 fetch_xor(arg) ^ arg と同等です。

符号付きの整数型の場合、算術演算は2の補数表現を使用すると定義されています。 未定義の結果はありません。

浮動小数点型の場合、有効な浮動小数点環境は呼び出し元スレッドの浮動小数点環境と異なることがあります。 演算が対応する std::numeric_limits 型特性に従うことは、必要ではありませんが、推奨されます。 結果がその型で表現可能な値でない場合、結果は未規定ですが、それを除けば演算は未定義動作を持ちません。

(C++20およびそれ以降)

T* 型の場合、結果が未定義のアドレスとなることはありますが、それを除けば演算は未定義動作を持ちません。 T がオブジェクト型でない場合、プログラムは ill-formed です。

目次

[編集] 引数

arg - 算術演算の引数

[編集] 戻り値

結果の値。 つまり、 *this変更順序における、対応するメンバ関数の効果の直前の値に、対応する二項演算子を適用した結果。

[編集] ノート

ほとんどの複合代入演算子と異なり、アトミック型の複合代入演算子は左側の引数を指す参照を返しません。 代わりに格納された値のコピーを返します。

[編集] 欠陥報告

以下の動作変更欠陥報告は以前に発行された C++ 標準に遡って適用されました。

DR 適用先 発行時の動作 正しい動作
P0558R1 C++11 arithmetic permitted on pointers to cv void or function made ill-formed

[編集] 関連項目

アトミック値を1つインクリメントまたはデクリメントします
(パブリックメンバ関数) [edit]