2013-06-11 13 views
9

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>(); 
+0

La mia ipotesi è che i progettisti del linguaggio abbiano deciso che la sintassi 's1_ (x1)' esistente è abbastanza sufficiente. – dasblinkenlight

+0

@dasblinkenlight chiaramente non lo è (considera MVP). –

+0

Il tuo ultimo esempio è illegale. 'void' è un tipo di oggetto incompleto; non c'è modo di creare oggetti di tipo 'void'. – Angew

risposta

0

Le regole di inizializzazione C++ sono piuttosto complicati. Sono descritti nella seconda metà del capitolo (clausola) 8 dello standard. Esistono inizializzazione zero, inizializzazione diretta, inizializzazione del valore, inizializzazione della copia, inizializzazione della lista per citarne solo alcuni e ciascuna può avere interazioni diverse a seconda del contesto (dichiarazione, parametro, ritorno, lancio, inizializzatore membro, ecc.), proprietà del tipo da rilegare e espressione di inizializzazione dell'input o bretella-init-list. I progettisti di linguaggi rendono anche l'obiettivo di essere quasi retrocompatibili con C e versioni precedenti di C++, il che limita ciò che possono fare. Ci vuole un po 'di studio per speculare sulle ramificazioni delle modifiche alle regole di inizializzazione, e le modifiche possono generare molti casi angusti non voluti. Se sei interessato ti incoraggio a studiare lo standard e provare a lavorare sulle implicazioni di un cambiamento proposto che hai progettato.

Problemi correlati