To robi. Dla wartości typu T
, T()
-inicjuje "obiekt" typu T
i generuje wyrażenie rvalue.
int a = int();
assert(a == 0);
same dla POD klas:
struct A { int a; };
assert(A().a == 0);
również prawdziwe dla niektórych klas non-POD, które bez zadeklarowane konstruktora:
struct A { ~A() { } int a; };
assert(A().a == 0);
Ponieważ nie można zrobić A a()
(tworzy deklaracja funkcji), boost ma klasę value_initialized
, pozwalającą na obejście tego, a C++ 1x będzie miało następującą, alternatywną składnię:
int a{};
w suchej słowami standardu brzmi jak
Wyrażenie (T), gdzie T oznacza prosty typu specyfikator (7.1.5.2) dla nie matrycowego pełnego obiektu Typ lub (ewentualnie cv wykwalifikowany) void typ, tworzy rvalue określonego typu, który jest wartość zainicjowany
Ponieważ typedef-name to nazwa rodzaju, który jest prosty typu specifier sama w sobie, działa to dobrze.
Przeszukałem projekt standardu próbując to zrozumieć.Zapomniałem o typedef i próbowałem dowiedzieć się, w jaki sposób typ wskaźnika może być prostym typem (nie jest), a teraz ma sens: nie możesz zrobić int *(), ale możesz to zrobić T(), jeśli T jest wpisane jako int *. –
Co z członkami typu POD POD i POD? –
struct A {~ A() {} int a; }; jest typem non-pod. Gdybyś sam wprowadził konstruktora, wartość "a" zależy oczywiście od tego, co robi konstruktor. –