8

この質問は、より適切な Usenet にも送信されていますが、これはより大規模で信頼性の高いフォーラムです。

std::allocator::constructは、引数パラメータ パックを括弧を使用してオブジェクト構築に転送するように定義されています (別名、直接初期化)。

中かっこ、つまり均一な初期化を使用するstd::make_sharedと、 や などの関数から集約データ型を初期化できますcontainer::emplace。また、イニシャライザ リストの内容をそのような関数の引数リストに入れ、initializer_list転送時の型推定の問題を解決することもできます。

この代替案は考慮され、却下されましたか? 将来の規格に切り替えるには遅すぎますか? これは重大な変更になるようですが、特に凶悪なものではありません。

4

1 に答える 1

10

SC が何を考慮したかはわかりませんが、均一な初期化は一般的なコンテキストでは実際には「機能しない」ことに注意してください (値の構築を除く*)。この試みを考えてみましょう:

template<typename T, typename... Args>
T
make(Args&&... args)
{
    return T { std::forward<Args>(args)... };
}

あなたは得る:

assert( make<std::vector<int>>(10, 0).size() == 2 );
assert( std::vector<int>(10, 0).size() == 10 );

これはコンパイルされません:

make<std::vector<int*>>(10u, 0);

一方、これは:

std::vector<int*>(10u, 0);

これを引き起こす完全な転送とイニシャライザ リストとの間の特定の相互作用がすぐに形式化された場合、SC が最初からやり直すことを望んでいないことがわかります。

(*):T {}一般的なコンテキストでも問題ありません。

于 2011-10-19T11:02:06.627 に答える