2013-07-29 9 views

risposta

84

correttamente, il primo sarebbe utilizzare box a = { { 1 } }, in modo da avere un set di parentesi graffe per ogni aggregato. L'insieme esterno di parentesi graffe è per la struttura e l'insieme interno è per l'array. Tuttavia, il linguaggio consente di omettere le parentesi interne.

In quest'ultimo, non ci sono parentesi interne da omettere. Non è consentito omettere le parentesi esterne; è necessario disporre di almeno un set di parentesi per distinguere un elenco di inizializzatori per un aggregato. In un certo senso, le parentesi dicono "Ecco una lista di cose da mettere dentro l'aggregato". Quando scrivi box b = 2, il compilatore non sa che vuoi inserire 2all'interno dello il totale. Invece, sembra che tu stia cercando di inizializzare l'oggetto b (anziché parte di esso) su 2. Quindi il compilatore tenta di trovare un costruttore o una conversione che modifichi un 2 in un box. Quando questo fallisce, si ottiene un errore.

+5

anche noi siamo autorizzati a dichiarare int come: 'int i = {10};' –

+7

@GrijeshChauhan: Ho omesso questo perché non è rilevante e complica la discussione. La domanda è perché non possiamo omettere le parentesi graffe, non perché possiamo aggiungerle. Ed è un caso speciale per gli scalari che le specifiche del linguaggio trattano separatamente, non una parte delle regole per gli aggregati. –

+2

Grazie Grijesh, non lo sapevo! –

17

Non funziona perché la sintassi è errata. È possibile aggiungere il supporto per b = 2 con un costruttore implicito, se questo è ciò che si desidera.

box b = {2}; // correct syntax with no constructor 

O

struct box 
{ 
    // implicit constructor 
    box(int i) : i(i) {} 
    int i; 
}; 

box b(2); 
box c = 2; 

O

struct box 
{ 
    explicit box(int i) : i(i) {} 
    int i; 
}; 

box b(2); 
box c = 2; // disallowed 
+0

Neil che si chiude come 'char * s =" A "' e 'char * s = {" A "}' entrambi sono possibili. –

+1

@GrijeshChauhan: In realtà 'char * s =" A "' non è più possibile in C++ 11 (senza preavviso). Devi usare 'const'. (Bene 'char *' per stringhe letterali è ** deprecato **, per essere pedante) – Nawaz

+1

@Nawaz interessante quindi devo fare sia: 'const char * s = {" A "}' o 'const char * s = "A" 'in C++ 11 **? ** –