2010-11-26 76 views
9
struct my 
{ 
    my(){ std::cout<<"Default";} 
    my(const my& m){ std::cout<<"Copy";} 
    ~my(){ std::cout<<"Destructor";} 
}; 

int main() 
{ 
    my m(); //1 
    my n(my()); //2 
} 

預期輸出:構造函數調用機制

1) Default 
2) Copy 

實際輸出:


這有什麼錯我的構造函數調用機制的理解?

Note爲了簡潔,我省略了頭文件。

回答

11

案例1)

m被解釋爲一個函數返回my並沒有參數。 要看到預期的輸出中刪除()即使用my m;

案例2)

這是更好的東西被稱爲「最棘手的解析」。

n被解釋爲返回my的函數,該函數將類型指針的參數返回給函數返回my,不帶參數。

要看到在這種情況下,預期的輸出嘗試my n((my()));

我的解釋[不是把作爲參數規格在前者的情況下,編譯器可以將其理解爲一種表達,因爲額外的()的]:

my n((my()))相當於my n = my()。現在右值表達式my()創建一個臨時[即默認構造函數的調用]和n被複制初始化爲臨時對象[複製到複製構造函數,因爲沒有呼叫一些compiler optimization]

PS:我不是100%確定我的答案的最後部分。糾正我,如果我錯了。

+1

這不是所謂的RVO,但它確實是一種常見的優化。 – MSalters 2010-11-26 10:53:36

1

和Prasoon一樣,我懷疑C++編譯器是以一種你不期望的方式解析你的代碼。舉例來說,我認爲這是作爲解析函數原型聲明行

my m(); 

,而不是作爲一個變量聲明,並呼籲給構造 - 因此你爲什麼看不到輸出。