C++03 モードでは、atomic<T> テンプレート・クラスには意図的にコンストラクターが用意されていません。これは、「アトミック操作」セクションの GetUniqueInteger の例のように、すべてのファイルスコープ・コンストラクターが呼び出される前であっても、正常に動作する必要があるためです。atomic<T> にコンストラクターがあると、ファイルスコープ・インスタンスが参照された後で初期化される可能性があります。
コンストラクターのない C++ クラスでは、atomic<T> 型のオブジェクト X は、次のコンテキストで自動的にゼロに初期化されます。
X は、ファイルスコープ変数またはクラスのスタティック・データ・メンバーとして宣言されている
x はクラスのメンバーで、コンストラクターの初期化子リストに明示的にリストされている
下記のコードは、これらのポイントを示しています。
atomic<int> x; // ファイルスコープにあるためゼロで初期化 class Foo { atomic<int> y; atomic<int> notzeroed; static atomic<int> z; public: Foo() : y() // y をゼロで初期化 { // ゼロでない場合は無指定の値がある } }; atomic<int> Foo::z; // スタティック・メンバーであるためゼロで初期化
C++11 モードでは、atomic<T> テンプレート・クラスには 2 つのコンストラクターが用意されています。
atomic() = default; コンパイラーによって生成されるデフォルト・コンストラクター。このコンストラクターは、ユーザー定義コンストラクターが何も宣言されていない場合と同じように動作します。このコンストラクターは、C++03 モードとの後方互換性があります (グローバル・オブジェクトのゼロ初期化など)。
constexpr atomic(T arg); このコンストラクターは、引数が変換時定数の場合、変換時にアトミック変数を初期化します。その他の場合、初期化は実行時に行われます。