考慮してください:
void foo() {
std::vector<std::atomic<int>> foo(10);
...
}
fooの内容は有効ですか?または、明示的にループして初期化する必要がありますか?私はGodboltを確認しましたが、問題はないようですが、この点については標準が非常に混乱しているようです。
std ::ベクトルコンストラクタは、それが挿入言うデフォルトの挿入のインスタンスstd::atomic<int>
は、初期化値ビア配置をnew
。
値の初期化のこの効果は当てはまると思います:
2)Tがユーザー提供でも削除でもないデフォルトコンストラクターを持つクラス型(つまり、暗黙的に定義またはデフォルト化されたデフォルトコンストラクターを持つクラスである可能性がある)である場合、オブジェクトはゼロ初期化され、その後重要なデフォルトコンストラクターがある場合はdefault-initialized。
したがって、アトミックはゼロで初期化されているように思えます。だから問題は、std::atomic<int>
有効なオブジェクトの結果のゼロ初期化ですか?
答えは「実際にはそうですが、実際には定義されていません」と思いますか?
注:この回答は、それがゼロで初期化されていることには同意していますが、それがオブジェクトが有効であることを意味するかどうかについては、実際には言っていません。
atomic_init
。とにかく問題のコードの周りですでに同期している必要があります