obj应该在函数调用结束时被销毁&f 39,返回的对象应该是一个新对象。我应该得到#34;毁灭"消息两次。
#include <iostream>
using namespace std;
class c{
int i;
public:
~c(){cout<<"Destroying"<<endl;}
c(){cout<<"Constructing"<<endl;}
c(const c &a){cout<<"Copy Constructing"<<endl;}
int get_i(){cout<<i<<endl;return i;}
void set_i(int i){this->i=i;}
};
c f(){
c obj;
obj.set_i(1);
return obj;
}
int main() {
f().get_i();
return 0;
}
答案 0 :(得分:1)
这被命名为返回值优化(NRVO)。删除不必要的对象副本是一种优化。对象obj
直接在函数的返回值中构造。
在少数情况下明确允许复制,包括:
在具有类返回类型的函数的return语句中,当表达式是非易失性自动对象(函数或catch子句参数除外)的名称时,具有与函数相同的cv-unqualified类型返回类型,通过将自动对象直接构造到函数的返回值
中,可以省略复制/移动操作