c++ 关于返回值、将亡值的调用研究
c++11引入右值引用,而出现右值引用的有这几种:返回值(将亡值),常量。
class Obj { public: Obj() { cout << "构造函数" << endl; } ~Obj() { cout << "析构函数" << endl; } Obj(const Obj& l) { cout << "拷贝构造函数" << endl; } /* Obj(Obj&& l) { cout << "移动构造函数" << endl; }*/ void operator=(Obj& r) { cout << "赋值函数" << endl; } void operator=(Obj&& r) { cout << "移动赋值函数" << endl; } }; Obj getObj() { Obj oo; return oo; } void Call(Obj o) { cout << "Call" << endl; } int main() { // Obj o; Obj o = getObj(); cout<<"obj call"<<endl; Call(getObj()); return 0; }
Obj对象如果没有移动构造函数,那么Call(getObj()), 这里产生的Obj临时对象,会进入Call的时候会调用拷贝构造函数,如果有移动构造函数,则使用移动构造函数,如果都没有则编译不过去,拷贝构造函数和移动构造函数至少有一个。
Obj o = getObj();接收赋值这一块延长了返回值的生命周期,而getObj的最终返回值也同样是调用的移动构造函数或者拷贝构造函数,移动构造函数优先。
延长的时间为o的生命周期,getObj()如果被Call调用的时候,Call函数对象的调用延长了getObj函数的生命周期。
运行结果 会有一次构造函数,一次拷贝构造函数,析构函数会看是否有人接收或者直接调用来延长其生命周期
由于目前的限制,编译器使用的是VS,为了尽可能的减少对象的构造,以及延长生命周期
#include <iostream> using namespace std; class Obj { public: Obj() { cout << "构造函数" << endl; } ~Obj() { cout << "析构函数" << endl; } Obj(const Obj& l) { cout << "拷贝构造函数" << endl; } Obj(Obj&& l) { cout << "移动构造函数" << endl; } void operator=(Obj& r) { cout << "赋值函数" << endl; } void operator=(Obj&& r) { cout << "移动赋值函数" << endl; } }; Obj&& getObj() { Obj oo; return move(oo); } void Call(Obj o) { cout << "Call" << endl; } int main() { // Obj o; Obj o = getObj(); cout << "obj call" << endl; //Call(getObj()); return 0; }
目前的实验方式中,只是将已经析构的将亡值的右值引用抬了出来。如何延长其生命周期??