2011-10-19 20 views
7

この質問はUsenetに提出されていますが、これはより適切ですが、これはより大きいより信頼性の高いフォーラムです。std :: allocatorでの直接的な初期化と均一な初期化

std::allocator::constructは、括弧を使用して建設をオブジェクトへの引数パラメータ パック、別名、直接初期化を転送するために定義されています。

それは括弧、別名均一な初期化を使用した場合、我々は、std::make_sharedcontainer::emplaceとして機能から 集約データタイプを初期化することができました。また、 フォワーディング下initializer_list型推論の問題を解決するような関数の引数リスト、 に初期化子リストの内容 を置くために許容可能です。

この代替は考慮され、拒否されましたか?将来の標準で を切り替えるのは遅すぎますか?これは急激な変化だと思われますが、特に凶悪なものではありません。

+3

スタックオーバーフロー_Usenet_より大きい! :P –

+0

@Tomalak:comp.std.C++とcomp.lang.C++よりも大きく、モデレートされています。 comp.lang.C++マッドハウスよりもはるかに元気で、私は気にしませんでした。 – Potatoswatter

+0

あなたは私の笑顔を見逃しました。 –

答えて

9

私は均一な初期化は本当に一般的な文脈での仕事 '(*値の建設を禁止する)しないことをSCが考えられて何を知っているが、覚えておいてくださいません。この試み考えてみましょう:

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

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

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

をあなたは得る

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

これが行うのに対し:

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

をする場合、特定の相互作用完璧な転送の間これを引き起こす原因となるイニシャライザリストは、SCがゼロから再開したくないとすぐに公式化されました。

(*):T {}も、一般的な文脈で結構です。

+0

Bah、Do The Right Thingのコンストラクタです。私はまだそれに噛まれていない。それでも、もう一つの選択肢があるのは良いことです。標準は、 'std :: is_constructible :: value'が' construct'の引数に対して 'true'であることを要求します。直接初期化は、UBの傘下の実装によって提供されるフォールバックとなる可能性があります。 – Potatoswatter

+0

@Potatoswattタイプは直接初期化を使用して構築可能である場合に限っている形質は 'true'をを返しますので、私はあなたが、フォールバックが均一初期化することを意味だと思います。興味深いアイデアは、現在のルールと下位互換性があります。 –

+0

はい、もちろんです:vP – Potatoswatter