2013-07-29 3 views

Antwort

84

richtig, würde der ehemalige box a = { { 1 } } verwenden, so dass Sie einen Satz von Klammern für jedes Aggregat haben. Der äußere Satz von Klammern ist für die Struktur und der innere Satz ist für das Array. Die Sprache erlaubt Ihnen jedoch, innere Klammern wegzulassen.

In letzterem gibt es keine inneren Klammern, die weggelassen werden müssen. Sie dürfen äußere Klammern nicht weglassen; Sie müssen mindestens eine Reihe von geschweiften Klammern haben, um eine Liste von Initialisierern für ein Aggregat zu unterscheiden. In gewissem Sinne sagen die geschweiften Klammern "Hier ist eine Liste von Dingen in das Aggregat zu setzen." Wenn Sie box b = 2 schreiben, weiß der Compiler nicht, dass Sie 2innerhalb das Aggregat setzen möchten. Es sieht stattdessen so aus, als ob Sie versuchen, das Objekt b (statt eines Teils davon) zu 2 zu initialisieren. Der Compiler versucht also, einen Konstruktor oder eine Konvertierung zu finden, die eine 2 in eine box ändert. Wenn dies fehlschlägt, erhalten Sie einen Fehler.

+5

sogar wir dürfen int zu deklarieren als: 'int i = {10};' –

+7

@GrijeshChauhan: Ich habe das weggelassen, weil es nicht relevant ist und die Diskussion erschwert. Die Frage ist, warum können wir Klammern nicht weglassen, nicht warum können wir sie hinzufügen. Und es ist ein Sonderfall für Skalare, dass die Sprachspezifikation separat behandelt, nicht ein Teil der Regeln für Aggregate. –

+2

Danke Grijesh, das wusste ich nicht! –

17

Es funktioniert nicht, weil Ihre Syntax falsch ist. Sie können Unterstützung für b = 2 mit einem impliziten Konstruktor hinzufügen, wenn Sie das möchten.

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

Oder

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

box b(2); 
box c = 2; 

Oder

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

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

Neil, das ähnlich wie 'char * s =" A "' und 'char * s = {" A "}' quit ist, beide sind möglich. –

+1

@GrijeshChauhan: Eigentlich ist 'char * s =" A "' in C++ 11 nicht mehr möglich (ohne Warnung). Sie müssen 'const' verwenden. (Well 'char *' für String-Literal ist ** veraltet **, um pedantisch zu sein) – Nawaz

+1

@Nawaz interessant, also muss ich entweder tun: 'const char * s = {" A "}' oder 'const char * s = "A" 'in C++ 11 **? ** –