std::vector<int>&& Ref()
{
std::vector<int> iv;
iv.push_back(1);
iv.push_back(1);
iv.push_back(1);
iv.push_back(1);
return std::move(iv);
}
std::vector<int> iq = Ref();
运行coredump。
std::vector<int> iq = Ref();我们知道函数返回对象的时候,是通过一个临时对象来传递的。
这里的返回值是右值引用,因此临时对象也是右值引用。右值引用首先也是引用。
这句话可以分解为:
std::vector<int>&& temp = std::move(iv);//右值引用内部局部变量,
函数结果,temp失效
std::vector<int> iq = temp;//ub
又例如:
void Test::Reff()
{
std::vector<int> iv;
iv.push_back(1);
iv.push_back(1);
iv.push_back(1);
iv.push_back(1);
result = std::move(iv);
}
这样写,这里result = std::move(iv);虽然iv是局部变量,但是iv在被result引用的时候,
生命周期还没有结束,result完成了移动构造,
然后函数结束,iv销毁,这样是没问题的。因为最终的 result = 已经移动拷贝了iv的右值引用类型。