2014-10-12 22 views
5

Dlaczego nie jest destruktor dla tymczasowego obiektu zwanego po ocenie pełną ekspresję:Tymczasowe zniszczenie obiektu

#include <iostream> 


struct A 
{ 
    int a; 
    A(); 
    ~A(); 
}; 

A::~A() 
{ 
    std::cout << "~A()" << std::endl; 
} 

A::A() 
{ 
    std::cout << "A()" << std::endl; 
} 



int main() 
{ 
    A b = A(); //Constructing of temporary object and applies copy-initalization 
    std::cout << "side effect" << std::endl; 
    //Destructor calling. 
} 

DEMO

wyjściowa:

A() 
side effect 
~A() 

Ale 12,2/3 [ class.temporary] mówi:

Gdy implementacja wprowadza tymczasowy obiekt klasy, który ma niestandardowy konstruktor (12.1, 12.8), musi on zapewnić, aby konstruktor został wywołany dla obiektu tymczasowego. Podobnie, destruktor powinien zostać wywołany jako tymczasowy z nietrywialnym destruktorem (12.4). Tymczasowe obiekty są niszczone jako ostatni krok w ocenie pełnego wyrażenia (1.9), który (leksykalnie) zawiera punkt , w którym zostały utworzone.

+2

'-fno-Elide-constructors', patrz [demo] (http://coliru.stacked-crooked.com/a/022dd0982db9c024) –

Odpowiedz

2

Z twoim kompilatorem i opcjami tymczasowy jest usuwany (zoptymalizowany), co jest dozwolone.

Tak więc nie ma tymczasowego.

Tak więc nie ma brakującej pary wywołania konstruktora i destruktora.


To również warto zauważyć, że kopiowanie i przenoszenie konstruktorzy są jedynymi konstruktorzy gdzie kompilator wolno zakładać że konstruktor nie ma skutków ubocznych, nawet gdy wie lepiej.

C++ 11 §12.8/31:
Kiedy pewne kryteria są spełnione, to implementacja wolno pominąć budowę kopia/ruch obiektu klasy, nawet jeśli kopia/move konstruktor i/lub destruktor obiektu mają efekty uboczne. [& Hellip;]

+0

kopiować i przenosić konstruktorzy, prawda? – hvd

+0

@hvd: Myślę, że masz rację, dzięki. Byłem w trybie C++ 03. Ale nie mam czasu, żeby to sprawdzić. Czy możesz to naprawić, jeśli jesteś tego pewien? –

+0

Komentowanie jest wystarczająco trudne na telefonie. Może poczekać, aż będziesz mieć czas na sprawdzenie :) – hvd