#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;
}
此代码还调用复制构造函数。为什么这行得通?我记得我第一次运行这个程序时,它出现了段错误。但过了一会儿,它开始称这个副本为缺点。现在工作!奇怪。
但是如果我替换, fun() 如下:
X fun() {
X s;
return s;
}
然后复制缺点。不叫。我认为副本的缺点。在这种情况下会被调用。但正如@flyfishr64 所指出的,RVO 正在发挥作用。但它仍然没有解释我返回参考的情况。我认为它应该总是段错误。
有什么解释吗?