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>();
私の推測では、言語の設計者は、既存の 's1_(x1)'構文がかなり十分であると判断したと思います。 – dasblinkenlight
@dasblinkenlight明らかにそうではありません(MVPを考慮)。 –
あなたの最後の例は不正です。 'void'は不完全なオブジェクト型です。型 'void'のオブジェクトを作成する方法はありません。 – Angew