# define ATOMIC_VAR_INIT(value) see below
この機能はC++20で非推奨となった。std::atomic
クラスのデフォルトコンストラクタが値初期化するようになったため、初期化のためにこの機能を使用する必要はない。
概要
アトミック変数の初期化
効果
このマクロは、静的ストレージを持つアトミック変数をvalue
で初期化するためのトークン列へと展開される(この操作はロックの初期化を必要とするかもしれない)。変数の初期化中に並行アクセスされた場合、それがアトミックな操作であったとしてもデータ競合を引き起こす。
備考
このマクロは、atomic
オブジェクトに対してはatomic<int> x(value);
と書くのと等価である。C言語との互換性のために存在している。
非推奨の詳細 (C++20)
C言語との互換性のために、std::atomic
クラスのデフォルトコンストラクタはトリビアルに定義され、初期値は未規定となっていた。そのためこの機能を介してstd::atomic
オブジェクトを初期化する必要があったが、C++20からデフォルトコンストラクタが値初期化を行うようになったため、初期化のためにこの機能を使用する必要はなくなった。
例
#include <iostream>
#include <atomic>
int main()
{
std::atomic<int> x = ATOMIC_VAR_INIT(3);
std::cout << x.load() << std::endl;
}
出力
3
バージョン
言語
- C++11
処理系
- Clang: ??
- GCC: 4.7.0 ✅
- ICC: ??
- Visual C++: 2012 ✅, 2013 ✅
実装例
# define ATOMIC_VAR_INIT(value) { value }