2009-05-25 9 views

Antwort

17

Es tut. Bei einem Typ T initialisiert T() value ein "Objekt" vom Typ T und liefert einen rvalue-Ausdruck.

int a = int(); 
assert(a == 0); 

Das Gleiche gilt für pod-Klassen:

struct A { int a; }; 
assert(A().a == 0); 

gilt auch für einige nicht-POD-Klassen, die keine Benutzer erklärt Konstruktor:

struct A { ~A() { } int a; }; 
assert(A().a == 0); 

Da Sie nicht A a() tun können (erzeugt ein Funktionserweiterung), Boost hat eine Klasse value_initialized, die es erlaubt, das zu umgehen, und C++ 1x wird folgende alternative Syntax haben:

int a{}; 

In den trockenen Worten des Standard, das klingt wie

Der Ausdruck T(), wobei T eine einfache Typ-Angabe (7.1.5.2) für ein nicht-Array kompletten Objekt Typ oder der (möglicherweise cv-qualifiziert) Hohlraumtyp, erzeugt einen R-Wert von dem Typ angegeben, der Wert initialisiert ist

Da ein typedef-Name ist ein Typname, das ein einfacher Typ-Spezifizierer selbst, das funktioniert gut.

+3

Ich habe über den Normentwurf gebohrt und versucht, dies herauszufinden.Ich hatte den typedef vergessen und versuchte herauszufinden, wie ein Zeigertyp ein Simple-Type-Specifier sein könnte (ist es nicht), und jetzt macht es Sinn: Sie können nicht int *() tun, aber Sie können T() wenn T typedef in Int * ist. –

+0

Was ist mit Nicht-POD-Typ und POD-Mitgliedern? –

+0

Struktur A {~ A() {} int a; }; ist ein Nicht-Pod-Typ. Hätten Sie selbst einen Konstruktor eingeführt, hängt der Wert von "a" natürlich davon ab, was dieser Konstruktor tut. –

2
#include <iostream> 
struct Foo { 
    char bar; 
    char baz; 
    char foobar; 
    // the struct is a POD 
    //virtual void a() { bar='b'; } 
}; 

int main() { 
    Foo o1; 
    Foo o2 = Foo(); 

    std::cout << "O1: " << (int)o1.bar <<" "<< (int)o1.baz <<" "<< (int)o1.foobar << std::endl; 
    std::cout << "O2: " << (int)o2.bar <<" "<< (int)o2.baz <<" "<< (int)o2.foobar << std::endl; 
    return 0; 
} 

Ausgang:

O1: -27 -98 0

O2: 0 0 0

Hinzufügen() verbreitet initializer ruft alle POD Mitglieder. die virtuelle Methode Uncomenting ändert Ausgabe:

O1: -44 -27 -98

O2: -71 -120 4

jedoch das Hinzufügen destructor ~ Foo() nicht unterdrücken die Initialisierung, obwohl es Nicht-POD-Objekt erstellt (Ausgabe ähnlich der ersten).