簡體   English   中英

什么是std :: move的類型?

[英]What's the type of std :: move?

此代碼按預期工作(在線 )。 最后v是空的, w不是空的,因為它已經竊取了v的內容。

    vector<int> v;
    v.push_back(1);
    cout << "v.size(): " << v.size() << endl;
    auto vp = move(v);
    vector<int> w(vp);
    cout << "w.size(): " << w.size() << endl;
    cout << "v.size(): " << v.size() << endl;

但是如果我用auto vp=move(v)替換auto vp=move(v)

    vector<int> && vp = move (v);

然后它不動。 相反,它復制,兩個向量最后都是非空的。 如圖所示這里

澄清:更具體地說,什么是自動派生類型的vp 如果它不是vector<int> && ,那還有什么呢? 為什么這兩個例子雖然如此相似但卻給出了不同的結果?

額外 :我也試過這個,它仍然復制而不是移動

    std :: remove_reference< vector<int> > :: type && vp = move(v);

編輯OP的澄清auto派生的move(v)類型move(v)vector<int> 請參閱C ++ 11“自動”語義

第一個例子是這樣的:

move 'v' into 'vp'
copy 'vp' into 'w'

第二個例子是這樣的:

set 'vp' as rvalue-reference of 'v'
copy 'vp' (which is 'v') into 'w'

什么std:move確實只是將一個類型轉換為rvalue(參見什么是std :: move(),什么時候應該使用它? )。 因此,在

vector<int>&& vp = move(v);

它只是將rvalue-reference vp設置為v vp執行任何其他操作。 另外,rvalue-reference是一個左值(它有一個名字),所以

vector<int> w(vp);

將調用復制構造函數將vp (即v )復制到w

如果你使vp為rvalue,它將調用move構造函數( 例子 ):

vector<int> w(move(vp))

您可能需要閱讀: C ++ Rvalue References Explained

在第一種情況下:

auto vp = move(v);

相當於:

vector<int> vp = move(v);

這會調用移動構造函數,因為move(v)具有類型vector<int>&& ,因此vp最終會竊取v的內容。

在第二種情況:

vector<int>&& vp = move(v);

只是使vp成為對v的r值引用。 這不會導致調用移動構造函數或復制構造函數,也不會導致任何操作。

auto vp = move(v);

正在創建一個新的vector<int>並調用它的move構造函數:

vector(const vector<T>&& other);

哪個會竊取v的內容。

因此'vp'的類型只是vector<int> ..沒有涉及的引用:

vector<int> vp;

它正在“移動”內部......而不是實際的矢量本身。

因此&vp將與&v ..不同,但內容將會移動。

暫無
暫無

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

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