[英]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.