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.
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. –
Was ist mit Nicht-POD-Typ und POD-Mitgliedern? –
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. –