我嘗試以下的代碼:矢量::的push_back和std ::移動
#include <iostream>
struct test{
test(){}
test(test const &){
std::cout<<__LINE__<<"\n";
}
test(test&&){
std::cout<<__LINE__<<"\n";
}
};
#include <vector>
#include <utility> // std::move
int main(){
auto&& tmp = test();
std::vector<test> v;
v.push_back(tmp);
std::cout<<__LINE__<<"\n";
v.push_back(std::move(tmp));
return 0;
}
的vs2013編譯器輸出:
6 //複製
9 //移動
9 //移動
的g ++以及鐺++輸出:
6 //複製
9 //移動
6 //複製
我的問題是:
是tmp測試的類型& &? tmp是一個右值嗎?
如果tmp的類型是test & &,爲什麼沒有第一個push_back使用移動構造函數?
最後一個輸出來自哪裏?爲什麼vs2013和g ++輸出不同的結果?
謝謝。
第三個問題的答案: 它來自於由andrew.punnett評論的重新分配。
我已經修改了我的答案,擴大安德魯的評論。 – Potatoswatter
最有效的解決方案是'v.emplace_back();',它既不需要拷貝也不需要移動。 – fredoverflow
注意:'v.emplace_back()'確實會移動該對象,如果它是在調用之前構造的 – DarkWanderer