2013-06-11 7 views
9

C++ 11では、オブジェクトの初期化構文が素晴らしいです。非オブジェクト型の初期化にも拡張されないのはなぜですか?オブジェクトに対して一様な初期化構文が適用されるのはなぜですか?

構文上のあいまいさがありますか、それとも愚かな質問ですか?

例:

struct s{ int k;}; 
s s1{1}; //ok (object initialization) 
s const& s3{3}; //ok (object initialization) 
s& s2{s1}; //error (reference initialization) 

より有用な例:

struct t{ t(t const& x) : k(x.k){} int k;}; 
struct c 
{ 
    c(t& x1,t& x2) 
    : s1_{x1} //error (reference initialization) 
    , s2_{x2} //ok (object initialization) 
    {} 
t& s1_; 
t s2_; 
}; 

もう一つ:

template<class T> 
T get() 
{ 
    return T{}; 
} 

//ok (object initialization) 
get<int>(); 
//error (void initialization? I do not know terminology for void() token equivalent) 
get<void>(); 
+0

私の推測では、言語の設計者は、既存の 's1_(x1)'構文がかなり十分であると判断したと思います。 – dasblinkenlight

+0

@dasblinkenlight明らかにそうではありません(MVPを考慮)。 –

+0

あなたの最後の例は不正です。 'void'は不完全なオブジェクト型です。型 'void'のオブジェクトを作成する方法はありません。 – Angew

答えて

0

C++の初期化ルールは非常に複雑です。それらは、標準の章(条項)8の後半に記載されています。宣言、パラメータ、戻り値、スロー、メンバ初期化子などのコンテキストに応じて、ゼロ初期化、直接初期化、値初期化、コピー初期化、リスト初期化などがあります。 )、バインドする型のプロパティ、入力初期化式、またはbraced-init-listを指定します。また、言語設計者は、C言語や古いバージョンのC++との下位互換性を達成することを目標にしており、できることを制限しています。初期化ルールの変更の影響を推測するにはかなりの研究が必要であり、変更によって意図しないコーナーケースが多く発生する可能性があります。興味があれば、標準を勉強して、あなたが設計した提案された変更の意味を理解しようとすることをお勧めします。

関連する問題