2009-05-25 16 views

Odpowiedz

17

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.

+3

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 *. –

+0

Co z członkami typu POD POD i POD? –

+0

struct A {~ A() {} int a; }; jest typem non-pod. Gdybyś sam wprowadził konstruktora, wartość "a" zależy oczywiście od tego, co robi konstruktor. –

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; 
} 

wyjściowa:

O1: -27 -98 0

O2: 0 0 0

Dodawanie() propaguje initializer zwraca się do wszystkich członków POD. Uncomenting metodę wirtualną zmienia wyjście:

O1: -44 -27 -98

O2: -71 -120 4

Jednak dodanie destruktor ~ Foo() nie tłumić inicjalizacja, chociaż tworzy obiekt inny niż POD (wyjście podobne do pierwszego).

Powiązane problemy