2014-10-12 11 views
5

Perché non è distruttore per oggetto temporaneo chiamato dopo aver valutato una full-espressione:temporanea oggetto distruzione

#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

uscita:

A() 
side effect 
~A() 

Ma 12,2/3 [ class.temporary] dice:

Quando un'implementazione introduce un oggetto temporaneo di una classe che ha un costruttore non banale (12.1, 12.8), deve assicurare che venga chiamato un costruttore per l'oggetto temporaneo. Allo stesso modo, il distruttore deve essere chiamato temporaneamente con un distruttore non banale (12.4). Gli oggetti temporanei vengono distrutti come ultimo passaggio in valutando l'espressione intera (1.9) che (in modo lessicale) contiene il punto in cui sono stati creati.

+2

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

risposta

2

Con il compilatore e le opzioni il temporaneo viene eliminato (ottimizzato), che è consentito.

Quindi non c'è temporaneo.

Quindi non c'è nessuna coppia di chiamata di distruttore e costruttore.


E 'anche la pena notare che la copia e spostare i costruttori sono gli unici costruttori in cui il compilatore è consentito assumere che il costruttore non ha effetti collaterali, anche quando si conosce meglio.

C++ 11 §12.8/31:
Quando determinati criteri sono soddisfatti, un'implementazione è consentito omettere la copia costruzione/spostamento di un oggetto classe, anche se la copia/move costruttore e/o distruttore per l'oggetto hanno effetti collaterali. [& Hellip;]

+0

copiare e spostare i costruttori, giusto? – hvd

+0

@hvd: Penso che tu abbia ragione, grazie. Ero in modalità C++ 03. Ma non ho il tempo di controllarlo. Puoi aggiustare per favore se sei sicuro? –

+0

I commenti sono abbastanza difficili su un telefono. Può aspettare fino a quando hai il tempo di controllare :) – hvd