2015-07-31 5 views
11

Warum ist der folgende Code in C++ zulässig?Warum ist es in C++ legal, einen Konstruktor eines primitiven Typs aufzurufen?

bool a(false); 

Ich meine, sollte der T a(VALUE) Konstruktor aufrufen, nicht wahr? Ich nehme an, es wird nicht als Funktionsdeklaration geparst. Aber bool ist ein einfacher Typ, es hat keinen Konstruktor. Oder tut es?

Ich verwende Visual Studio 2012, wenn es relevant ist.

+4

Es ist legal, weil die Designer der Sprache so gesagt haben. Was wäre ein guter Grund, es illegal zu machen? – juanchopanza

+0

'int x (5)' ist ebenfalls erlaubt. Der "Konstruktor" ist nur ein No-Op, wenn wir wollen. – edmz

+1

Warum einfache Typen keine Konstruktoren haben können? – user3528438

Antwort

13

ist, dass nur eine gültige Syntax ist).

Zum Beispiel würde folgendes gelten:

bool a(false); 
bool b(a); 
bool c = bool(); // initializes to false 

Eine interessante Sache ist zu beachten, dass in

int main(int argc, const char *argv[]) 
{ 
    bool f(); 
    return 0; 
} 

f ist eine Funktion Erklärung!

+0

'bool c = bool(); // initialisiert zu false "Bist du sicher? – user3528438

+1

@ user3528438, ja, nach dieser Aussage wäre 'c' ein' bool' mit 'false' als Wert. –

+0

Interessant, ich dachte 'bool c = bool();' ist äquivalent zu 'bool c;' und würde 'c' einen unbestimmten Wert geben, wenn' c' keine statische Speicherdauer ist. – user3528438

4

Dies unterscheidet sich nicht von irgendeinem anderen primativen Typ, z.B. POD-Typen zu initialisieren und hat ein ähnliches Verhalten zu einem Konstruktor (oder sogar ein Copykonstruktor was das betrifft

int a(5); 

Primitive Typen haben keine Konstrukteure, was Sie Aufruf direct-initialization

+2

Das sieht nicht wie Wert Initialisierung aus. – juanchopanza

+2

Ich denke du meinst direkte Initialisierung. –

+3

Sie sind beide richtig. Eines Tages werde ich den richtigen Namen bekommen, ohne cppreference zu überprüfen! – CoryKramer

26

Obwohl bool ein primitiver Typ ist und als solcher keinen Konstruktor hat, haben Sprachdesigner eine einheitliche Initialisierungssyntax eingeführt, die sowohl für Primitive als auch für Klassen funktioniert. Dies vereinfacht den Template-Code schreiben, weil Sie die

mit weiter
T tVar(initialVal); 

Syntax, ohne zu wissen, ob T, ein Parameter Vorlagentyp, primitiv ist oder nicht. Dies ist ein sehr wichtiger Vorteil für Template-Designer, da sie nicht mehr über Template-Typ-Parameter in Bezug auf Primitive vs. Klassen nachdenken müssen.

+0

Dies sollte als Antwort akzeptiert werden. Ich mag diese Antwort wirklich, weil sie den wahren Grund für diese Syntax erklärt. Bjarne Stroustrup sagt auch genau so in seinem Buch "Die C++ Programmiersprache" Abschnitt 6.2.8.+5 – Destructor

+0

Upvoted. jetzt hat es 2x mehr als die angenommene Antwort gewählt. Hoppe, du bekommst jetzt ein goldenes Abzeichen. ;-) – Nawaz

Verwandte Themen