Jeśli A
jest typu POD, a następnie new A
przydzieli nowy A
obiektu, ale pozostawić ją z wartością nieokreślony, inaczej new A
będzie domyślny zainicjować nowy obiekt.
We wszystkich przypadkach new A()
będzie wartość zainicjować nowy obiekt A
.
Jest to oczywiście inne zachowanie dla typów POD, ale ma również wpływ na typy inne niż POD, niezwiązane z klasami związków bez deklaracji używanego konstruktora.
E.g.
struct A
{
int a;
std::string s;
};
A
jest klasą inną niż POD bez konstruktora deklarowanego przez użytkownika. Kiedy A
jest domyślnie zainicjowany domyślnie zdefiniowany konstruktor jest wywoływany, który wywołuje domyślny konstruktor dla s
(typ inny niż POD), ale a
nie został zainicjowany.
Gdy A
jest wartość zainicjowany, gdyż nie ma używanych zadeklarowany konstruktor, wszyscy jej członkowie są wartość zainicjowany co oznacza, że konstruktor domyślny dla s
nazywa i a
jest zerowy zainicjowany.
ISO 14882: 2003 odnośników:
5.3.4 [expr.new]/15: Jak obiekty przydzielone przez wyrażenie new
są inicjowane w zależności od tego, czy inicjator jest pomijany, parę nawiasów lub Inaczej.
8,5 [dcl.init]/5: sens zera zainicjować, domyślny zainicjować i wartości inicjalizacji.
12.1 [class.ctor]/7,8: Formularz konstruktora napisanego przez użytkownika, który pasuje do zachowania niejawnie zdefiniowanego domyślnego konstruktora.
12.6.2 [class.base.init]/4: W jaki sposób inicjowane są bazy i elementy, które nie są wymienione na liście inicjalizatora elementu konstruktora.
To się zgadza. –
hmmm, jakieś referencje? – hasen
, a sformułowanie jest rzeczywiście mylące. Czym do cholery jest POD? – hasen