目录
代码1,无右值引用,生命周期立刻结束
代码2,有右值引用,生命周期延长到引用的生命周期结束时
以上结论只适用于纯右值,不适用将亡值
右值引用的一个作用是延长纯右值的生命周期。对比如下的代码:
代码1,无右值引用,生命周期立刻结束
#include <iostream>
using namespace std;
class cls
{
public:
cls(){ a = 0; cout << "construct"<<endl; }
cls(const cls & other){ a = other.a; cout << "copy" << endl; }
cls(cls && other) { a = other.a; cout << "move" << endl; }
~cls(){ cout << "destruct" << endl; }
int a;
};
cls clsGet()
{
return cls();
}
int main()
{
{
clsGet();
cout << "i.a =" << endl;
}
cin.get();
return 0;
}
结果:
可见,析构发生在i.a = 打印之前。
代码2,有右值引用,生命周期延长到引用的生命周期结束时
#include <iostream>
using namespace std;
class cls
{
public:
cls(){ a = 0; cout << "construct"<<endl; }
cls(const cls & other){ a = other.a; cout << "copy" << endl; }
cls(cls && other) { a = other.a; cout << "move" << endl; }
~cls(){ cout << "destruct" << endl; }
int a;
};
cls clsGet()
{
return cls();
}
int main()
{
{
cls i = clsGet();
cout << "i.a =" <<i.a<< endl;
}
cin.get();
return 0;
}
结果:
可见,析构发生在打印i.a=之后,其实是花括号结束时。
以上结论只适用于纯右值,不适用将亡值
假如把clsGet函数的返回值定义为 cls &&,则clsGet返回将亡值,而不是纯右值。此时程序行为是未定义的:
cls && clsGet()
{
return cls();
}
文章来源:https://www.toymoban.com/news/detail-400327.html
文章来源地址https://www.toymoban.com/news/detail-400327.html
到了这里,关于理解移动语义(二)--延长变量的生命周期的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!