obj应该在函数调用'f'结束时被销毁

时间:2014-07-12 08:49:36

标签: c++

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;
}

1 个答案:

答案 0 :(得分:1)

这被命名为返回值优化(NRVO)。删除不必要的对象副本是一种优化。对象obj直接在函数的返回值中构造。

在少数情况下明确允许复制,包括:

  

在具有类返回类型的函数的return语句中,当表达式是非易失性自动对象(函数或catch子句参数除外)的名称时,具有与函数相同的cv-unqualified类型返回类型,通过将自动对象直接构造到函数的返回值

中,可以省略复制/移动操作