2012-05-29 14 views
4

說,我有一個A級爲什麼拷貝構造函數沒有得到所謂的在這種情況下

現在,當我做

A a(A()); 

到底發生了什麼?

+1

我會想象會被優化了,如果它不被調用。 – chris

+0

@chris我不太確定。返回值優化(RVO)是允許的,但是單個函數中的副本又如何呢? – delnan

+0

@chris ...我知道複製構造函數elison概念的情況A a = A(),在這種情況下默認構造函數被調用。但在上述情況下,默認和複製構造函數都不會被調用 –

回答

11

儘管出現,A a(A());不是對象定義。相反,它聲明瞭一個名爲a的函數,它返回一個A並將指針指向一個無所作爲並返回A的函數。

如果你想要一個對象定義,你必須添加另一對括號:

A a((A())); 
+0

如果不需要一組額外的括號,請使用C++ 11中的'A {A {}}'來調用副本。 – 2012-05-29 17:00:48

+0

@FredOverflow你能否詳細解釋:) – Invictus

+0

@FredOverflow ....你能舉個例子來說明如何使用這個函數聲明。 –

8

如果編寫正確 - A a((A())) - 編譯器會直接在構造函數上下文中創建臨時文件,以防止出現額外的副本。它被稱爲複製elision。看看這個,以及RVO和NRVO。

從您的評論:

A a = A(); 

這是正是相當於

A a((A())); // note extra pair of parenthesis 

由於@Naveen正確地指出,A a(A());是受到最讓人頭疼的解析,所以你需要一個額外的集在那裏真正創造一個物體。

+3

它不是最令人頭疼的C++解析的例子嗎?我試着用這個代碼:http://ideone.com/ZVXoT – Naveen

+0

@Naveen是的,在那裏額外的paranthesis。 –

相關問題