2015-05-19 9 views
20

Domanda: Un valore di ritorno ignorato viene distrutto immediatamente o al momento esce dall'ambito.?C++: il comportamento di distruzione del valore di ritorno ignorato è ben definito

Il seguente codice restituisce per il mio compilatore

uscita:

chi lo fa, non ha bisogno di esso.

Chi lo compra, non ne ha bisogno.

Chi lo usa non può né vederlo né sentirlo.

Che cos'è?

Pertanto il valore ignorato viene immediatamente eliminato. Ma questo comportamento del compilatore è specifico o standard?

struct foo 
{ 
    ~foo() 
    { 
     std::cout << "Who makes it, has no need of it. \n" 
       << "Who buys it, has no use for it. \n"; 
    } 
} 

foo createFoo() 
{ 
    return foo(); 
} 

int main(int argc, char* argv[]) 
{ 
    createFoo(); 
    std::cout << "Who uses it can neither see nor feel it.\n" 
       << "What is it?"; 
} 

risposta

15

La restituito temporaneo viene distrutto immediatamente dopo l'espressione completo completa tranne se la sua durata è esteso essendo legato ad un rvalue o riferimento Ivalue const.

+4

... o ad un riferimento di rvalue. – Angew

+0

forse un esempio sarebbe utile – user1235183

+1

Basta rimuovere la parola "const". Inoltre, il verbo è * distrutto *. –

5

Nello standard 5.11 ha

In alcuni contesti, l'espressione appare solo per i suoi effetti collaterali. Tale espressione è chiamata espressione valore scartato. L'espressione viene valutata e il suo valore viene scartato.

Quindi quando l'espressione termina il valore viene quindi scartato e se si tratta di un tipo di classe viene chiamato il distruttore.

+1

In aggiunta a ciò, 12.8.32 sottolinea che il compilatore MAGGIO omette la copia del valore di ritorno, come ha fatto qui. Un compilatore diverso può stampare la prima metà dell'enigma due volte perché distruggerebbe una copia poiché ha lasciato l'ambito di 'createFoo' e una volta nella riga in' main' chiamando 'createFoo', come indica la risposta di Nathan. –

4

§12.2 /3

oggetti temporanei vengono distrutti come ultimo passaggio nella valutazione pieno-espressione (1.9) che (lessicale) contiene il punto in cui sono stati creati. Questo è vero anche se la valutazione termina con il lancio di un'eccezione. I calcoli del valore e gli effetti collaterali della distruzione di un oggetto temporaneo sono associati solo all'espressione completa, non a una sottoespressione specifica.

Le eccezioni sono per gli argomenti del costruttore e per i riferimenti di associazione a un riferimento temporaneo. (§12.3/4f.)

+0

In particolare, solo i temporanei creati dagli argomenti predefiniti del costruttore. –

+0

Esiste un'eccezione aggiuntiva che si verifica durante l'inizializzazione degli array. – Brian

Problemi correlati