2015-10-18 39 views
10

不應該「這裏的」被打印之前臨時A(3)被破壞?臨時A(3)不應該在打印「Here」之前銷燬?

#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'; 
} 

輸出:

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

Live example

+3

不,一旦對象超出範圍(即達到main的'}'時,析構函數就會被調用)。 – 101010

+0

@ 101010是不是臨時在聲明'的端部被破壞A中的[2] = {A(1),A(2)},A(3);'? –

回答

13

A(3)不是暫時對象,但A類型的對象稱爲A。這是一樣的邏輯:

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

我真的不知道你被允許這樣做。

+1

你可以做到這一點,但是你做到後,你必須參考類型'A'爲'結構A'因爲只是'A'是不明確的。 – SHR

5

進行了擴展,@尼爾·柯克的答覆的原因A(3)不是臨時的是,原線

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

實際上是兩個變量a[]A

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

的速記聲明類似的方法可以完成

int a = 1, b = 2; 

int a = 1; 
int b = 2; 
相關問題