Q
複製構造不調用
4
A
回答
5
這是複製Elision參考1:。
拷貝構造函數調用而產生的臨時可能會被編譯器內聯創建對象進行優化,這是明確的C++標準允許的。
這是很好的證明在一個示例性的標準,以及:
C++ 03標準12.2臨時對象[class.temporary]
第2段:
[Example:
class X {
// ...
public:
// ...
X(int);
X(const X&);
˜X();
};
X f(X);
void g()
{
X a(1);
X b = f(X(2));
a = f(a);
}
這裏,實現可能在使用臨時使用X的副本,利弊它傳遞給
f()
之前構建X(2)
tructor;或者,X(2)
可能會在用於保存參數的空間中構建。另外,臨時可以用於在將其複製到`b using
之前保留f(X(2))
的結果,以及f。 ]
價1:
C++ 03 12.8複製類對象[class.copy]
第12段:
當滿足一定的條件,一個實現允許省略一個類對象的拷貝結構,即使拷貝構造和/或destructo R代表該物體有副作用.....
5
複製初始化仍然受複製elision,我猜這就是發生了什麼。從理論上講,臨時B
從a
構造和拷貝構造函數用於創建從臨時b
。實際上,副本可以被優化。
要進行測試,可以使拷貝構造函數私有:
class B{
public:
B(const A &a){cout << "B construct from A" << endl;}
private:
B(const B &b){cout << "B copy constructor" << endl;}
};
,並得到一個編譯錯誤。這意味着編譯器期望複製構造函數是可訪問的,但不需要調用它。
複製省略在這裏觀察到的行爲可被改變的唯一情況。
相關問題
- 1. 複製構造不調用
- 2. 複製構造不會被調用
- 3. 複製構造函數未調用?
- 4. Haskell「複製構造函數」調用
- 5. 複製構造函數調用C++
- 6. 複製構造函數的調用
- 7. C++複製構造函數調用
- 8. Java調用複製構造函數
- 9. 成本調用複製構造和正常構造
- 10. C + +複製構造函數不復制
- 11. 複製構造
- 12. 爲什麼在調用複製構造函數之前調用構造函數?
- 13. 爲什麼調用複製構造函數而不是移動構造函數?
- 14. 複製參數調用構造函數刪除時構造不應該叫
- 15. 複製構造函數不被調用用於複製初始化或優化?
- 16. Niether複製也不移動構造函數調用在c + +
- 17. 重置一個對象而不調用複製構造函數?
- 18. 複製構造函數調用析構函數C++
- 19. 複製構造函數調用默認構造函數以創建對象
- 20. 當調用複製構造函數或賦值構造函數時?
- 21. 複製構造函數不叫
- 22. 複製構造是不能繼承
- 23. 複製構造函數不叫!
- 24. 複製構造函數不工作?
- 25. 在複製構造函數內調用動態分配的類'複製構造函數?
- 26. 複製構造函數的std :: containers調用是否包含複製構造函數?
- 27. 如何從派生類複製構造函數調用基類複製構造函數?
- 28. 複製構造與功能
- 29. 複製構造函數
- 30. 複製構造函數bug
@LuchianGrigore:gcc版本4.6.3 20120306(紅帽4.6.3-2)(GCC) –