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

the obj should have been destroyed at the end of function call 'f'

本文关键字:函数调用 结束 OBJ      更新时间:2023-10-16

对象应该在函数调用'f'结束时被销毁,返回的对象应该是一个新对象。我应该两次收到"正在破坏"的信息。

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

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

在一些情况下明确允许省略副本,包括:

在具有类返回类型的函数中的返回语句

中,当表达式是与函数返回类型相同的非易失性自动对象(函数或catch子句形参除外)的名称时,可以通过直接将自动对象构造为函数的返回值

来省略复制/移动操作。