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的右值引用類型。