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; // スタティック・メンバーであるためゼロで初期化