回答
儘管出現,A a(A());
不是對象定義。相反,它聲明瞭一個名爲a
的函數,它返回一個A
並將指針指向一個無所作爲並返回A
的函數。
如果你想要一個對象定義,你必須添加另一對括號:
A a((A()));
如果不需要一組額外的括號,請使用C++ 11中的'A {A {}}'來調用副本。 – 2012-05-29 17:00:48
@FredOverflow你能否詳細解釋:) – Invictus
@FredOverflow ....你能舉個例子來說明如何使用這個函數聲明。 –
如果編寫正確 - A a((A()))
- 編譯器會直接在構造函數上下文中創建臨時文件,以防止出現額外的副本。它被稱爲複製elision。看看這個,以及RVO和NRVO。
從您的評論:
A a = A();
這是正是相當於
A a((A())); // note extra pair of parenthesis
由於@Naveen正確地指出,A a(A());
是受到最讓人頭疼的解析,所以你需要一個額外的集在那裏真正創造一個物體。
它不是最令人頭疼的C++解析的例子嗎?我試着用這個代碼:http://ideone.com/ZVXoT – Naveen
@Naveen是的,在那裏額外的paranthesis。 –
- 1. 在哪種情況下調用C++拷貝構造函數?
- 2. 爲什麼CAsyncSocket沒有拷貝構造函數或=操作符?
- 3. 爲什麼不NRVO沒有拷貝構造函數工作
- 4. 爲什麼隱式拷貝構造函數調用基類拷貝構造函數並且定義的拷貝構造函數沒有?
- 5. 爲什麼在這裏調用拷貝構造函數?
- 6. 爲什麼這個拷貝構造函數不工作?
- 7. 這個拷貝構造函數有什麼問題?
- 8. 重新定義拷貝構造函數沒有得到執行
- 9. 拷貝構造函數和賦值操作符都得到所謂
- 10. 爲什麼在這種情況下構造類模板的成員函數?
- 11. 爲什麼編譯器未在此情況下eliding遠拷貝構造
- 12. MI和隱式拷貝構造函數bug(是:在什麼情況下模板可以作爲拷貝構造函數?)
- 13. 的拷貝構造函數
- 14. 爲什麼在這種情況下調用複製構造函數?
- 15. 爲什麼java在這種情況下先調用NOT default構造函數?
- 16. 爲什麼移動構造函數在這種情況下不會被調用?
- 17. 爲什麼在這種情況下複製構造函數匹配?
- 18. 推力::怎麼做這種情況下的選擇拷貝
- 19. 拷貝構造函數
- 20. 拷貝構造函數knowlege
- 21. 拷貝構造函數++
- 22. 沒有拷貝構造函數可用或拷貝構造函數被聲明爲'explicit'
- 23. 爲什麼沒有調用成員類的拷貝構造函數?
- 24. 拷貝賦值爲未實現的拷貝構造函數
- 25. 爲什麼我的拷貝構造函數不被調用?
- 26. 在這種情況下,爲什麼我會得到Unreachable Code?
- 27. 爲什麼在這種情況下我得到零錯誤?
- 28. 爲什麼在這三種情況下
- 29. 爲什麼在這種情況下
- 30. 爲什麼在這種情況下
我會想象會被優化了,如果它不被調用。 – chris
@chris我不太確定。返回值優化(RVO)是允許的,但是單個函數中的副本又如何呢? – delnan
@chris ...我知道複製構造函數elison概念的情況A a = A(),在這種情況下默認構造函數被調用。但在上述情況下,默認和複製構造函數都不會被調用 –