[英]std::move Not Working on RValue Reference Function
在嘗試學習std :: move和rvalue引用時,我遇到了以下問題:
int _tmain(int argc, _TCHAR* argv[])
{
std::vector<int> vecNumbers;
vecNumbers.push_back(10);
vecNumbers.push_back(20);
foo(std::move(vecNumbers));
std::cout<<"After Move \n";
std::cout<<"size:"<<vecNumbers.size()<<"\n";
return 0;
}
void foo( std::vector<int> &&value)
{
std::cout<<"size in Function:"<<value.size()<<"\n";
}
輸出
size in Function:2
After Move
size:2
我曾期望在vector上調用move之后大小為0,但在這里它僅作為參考移動。 有人可以解釋一下這里發生了什么。
std::move
僅強制轉換為右值引用。
foo
Rvalue ref到vector<int>
。 通過move(vecNumbers)
獲得vector<int>&&
。 里面foo
你剛剛訪問vecNumbers
這是在定義main
。 您沒有執行任何更改此向量內容的操作。
如果您確實要移動(竊取) vecNumbers
內容, vecNumbers
必須調用move構造函數或move賦值運算符。 在foo
內部,您可以這樣操作:
void foo( std::vector<int>&& value)
{
std::vector<int> v1{std::move(value)}; // invoke move ctor which steals content of value
std::cout<<"size in Function:"<<value.size()<<"\n";
}
或者您可以將foo的簽名更改為:
void foo(std::vector<int> value) {
}
然后當你打電話
foo(std::move(vecNumbers))
調用vector<T>
move構造函數,該vecNumbers
將vecNumbers
移至foo
內部的value
。
您對移動的假設是錯誤的:
std :: move用於指示對象“ t”可以“移出”,即允許將資源從t高效轉移到另一個對象。
特別是,std :: move生成一個xvalue表達式,該表達式標識其參數t。 它完全等效於static_cast到右值引用類型。
這並不意味着向量的大小應隨您的代碼變為零。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.