#include <iostream>
using namespace std;
class X {
public:
X() {
cout<<"Cons"<<endl;
}
X(const X& x){
cout<<"Copy"<<endl;
}
void operator=(const X& x){
cout<<"Assignment called";
}
};
X& fun() {
X s;
return s;
}
int main(){
X s = fun();
return 0;
}
這段代碼也調用了拷貝構造函數。爲什麼這個工作?我記得我第一次運行這個程序時,它陷入了故障。但過了一段時間,它開始稱這個副本缺點。現在工作!奇怪的。g ++中奇怪的C++構造函數/拷貝構造函數問題
但是如果我更換,樂趣()如下:
X fun() {
X s;
return s;
}
然後複製利弊。不叫。我認爲副本缺點。在這種情況下會被調用。但正如@ flyfishr64指出的那樣,RVO即將在這裏發揮作用。但它仍不能解釋我返回參考的情況。我認爲它應該總是段錯誤。
任何解釋?
你不能只說「但過了一段時間,它開始稱這個副本缺點,現在工作!!」 - 你一定改變了一些東西。 – Smashery 2009-11-27 04:33:08
沒有。我做的唯一的事情是添加1 cout,然後刪除它。 – user855 2009-11-27 04:35:17
很有可能。因爲當我嘗試以下時,複製構造函數未被調用。 X&fun(){X s;返回s; } int main(){X&x = fun();返回0; } 但是用這個理論,是不是不意味着返回局部變量的引用總是有效的?因爲如果我在主窗口中執行X s = fun(),那麼拷貝構造函數無論如何都會被調用? – user855 2009-11-27 04:45:40