簡體   English   中英

std :: move無法在RValue參考函數上使用

[英]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構造函數,該vecNumbersvecNumbers移至foo內部的value

您對移動的假設是錯誤的:

std :: move用於指示對象“ t”可以“移出”,即允許將資源從t高效轉移到另一個對象。

特別是,std :: move生成一個xvalue表達式,該表達式標識其參數t。 它完全等效於static_cast到右值引用類型。

這並不意味着向量的大小應隨您的代碼變為零。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM