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.
}
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.
'-fno-Elide-constructors', patrz [demo] (http://coliru.stacked-crooked.com/a/022dd0982db9c024) –