2015-10-18 14 views
10

Il temporaneo A(3) non deve essere distrutto prima che venga stampato "Qui"?Non si dovrebbe distruggere il temporaneo A (3) prima che venga stampato "Qui"?

#include <iostream> 
struct A 
{ 
    int a; 
    A() { std::cout << "A()" << std::endl; } 
    A(int a) : a(a) { std::cout << "A(" << a << ")" << std::endl; } 
    ~A() { std::cout << "~A() " << a << '\n'; } 
}; 

int main() 
{ 
    A a[2] = { A(1), A(2) }, A(3); 
    std::cout << "Here" << '\n'; 
} 

uscita:

A(1) 
A(2) 
A(3) 
Here 
~A() 3 
~A() 2 
~A() 1 

Live example

+3

No, i distruttori vengono evocati non appena l'oggetto esce di portata (vale a dire, quando ''} raggiungimento del principale). – 101010

+0

@ 101010 Non è il temporaneo distrutto alla fine della dichiarazione 'A a [2] = {A (1), A (2)}, A (3);'? –

risposta

13

A(3) non è un oggetto temporaneo, ma un oggetto di tipo A chiamato A. È la stessa logica:

A a[2] = { A(1), A(2) }, a2(3); 

In realtà non sapevo che ti fosse permesso farlo.

+1

puoi farlo, ma dopo averlo fatto, devi fare riferimento al tipo 'A' come' struct A' perché solo 'A' sarebbe ambiguo. – SHR

5

Come estensione @ risposta di neil-kirk la ragione A(3) non è una temporanea è che la linea originale

A a[2] = { A(1), A(2) }, A(3); 

è davvero una dichiarazione abbreviata di due variabili a[] e A

A a[2] = { A(1), A(2) }; 
A A(3); 

simile a come potresti fare

int a = 1, b = 2; 

o

int a = 1; 
int b = 2;