In C++ 11 abbiamo una sintassi di inizializzazione uniforme per gli oggetti. Perché non si estende anche a inizializzare i tipi non-object?Perché la sintassi di inizializzazione uniforme viene applicata solo per gli oggetti?
C'è qualche ambiguità sintattica per quello, o è solo una domanda stupida che sto chiedendo?
Esempio:
struct s{ int k;};
s s1{1}; //ok (object initialization)
s const& s3{3}; //ok (object initialization)
s& s2{s1}; //error (reference initialization)
Un esempio più utile:
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_;
};
Un'altra:
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>();
La mia ipotesi è che i progettisti del linguaggio abbiano deciso che la sintassi 's1_ (x1)' esistente è abbastanza sufficiente. – dasblinkenlight
@dasblinkenlight chiaramente non lo è (considera MVP). –
Il tuo ultimo esempio è illegale. 'void' è un tipo di oggetto incompleto; non c'è modo di creare oggetti di tipo 'void'. – Angew