Я попытался следующий код:вектор :: push_back и станд :: двигаться
#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 // переезд
Г ++ и лязг ++ выход:
6 // скопировать
9 // двигаться
6 // скопировать
Мои проблемы:
Является типом теста tmp & &? Является ли tmp значением r?
Если тип tmp является тестом & &, почему первый конструктор перемещения push_back не использовал?
Откуда взялся последний выход? Почему vs2013 и g ++ выдают разные результаты?
Спасибо.
Ответ на 3-й вопрос: Он исходит из перераспределения, как прокомментировал andrew.punnett.
Я изменен свой ответ, чтобы расширить комментарий Эндрю. – Potatoswatter
Наиболее эффективным решением является 'v.emplace_back();' который не требует ни копий, ни ходов. – fredoverflow
Примечание: 'v.emplace_back()' перемещает объект, если он был создан до вызова – DarkWanderer