std::atomic<int>
のように、移動またはコピーのコンストラクタを持たないオブジェクトの固定サイズのstd::vector
を構築したいとします。この場合、基底のstd::atomic
クラスには、1つの引数のコンストラクタがあり、デフォルトのコンストラクタ(値を0に初期化する)と同様に、int
をとります。引数は最初initializer_list
の作成の一部として、ベクトルの要素型T
に変換し、そのコピーまたはコンストラクタを移動しているため、std::vector<std::atomic<int>> v{1,2,3}
ようinitializer_list
構文は動作しません使用std :: vectorの配置のような構造
が呼び出されます。
Iのベクターを構築デフォルト、次いで後の要素を変異させることができるstd::atomic<int>
の特定の場合において
:しかし、醜い非効率的であることに加えて、それは多くは一般的な解決策ではない
std::vector<std::atomic<int>> v(3);
v[0] = 1;
v[1] = 2;
v[2] = 3;
オブジェクトは、適切なコンストラクタを呼び出すことによって得ることができるものに相当する構築後の突然変異を提供しない可能性があります。
ベクター構築で "emplace-like"の動作を得る方法はありますか?
真剣に、私は 'std :: deque'を使うだけです。しかし、できない場合は、カスタムアロケータを使用して、必要なものを実行する唯一の方法があります。 – Brian
@Brian - 'std :: deque'はこの構造イディオムを許可しますか? – BeeOnRope
'std :: deque'では要素を一つずつ置き換えなければなりませんが、要素を先頭または末尾に追加しても他の要素は移動しないので機能します。 – Brian