Я проверил перемещение семантики в C++ 11. Я написал класс с конструктором перемещения.Почему поведение оператора перемещения C++ 11 (=) отличается от
class DefaultConstructor
{
public:
DefaultConstructor(std::vector<int> test) :
m_vec(std::forward<std::vector<int>>(test))
{
};
DefaultConstructor(DefaultConstructor &&def) :
m_vec(std::forward<std::vector<int>>(def.m_vec))
{
}
DefaultConstructor& operator=(DefaultConstructor&& def) {
m_vec = std::move(def.m_vec);
return *this;
}
DefaultConstructor& operator=(const DefaultConstructor&) = delete;
DefaultConstructor(DefaultConstructor &) = delete;
std::vector<int> m_vec;
};
Я написал основную функцию, использующую семантику перемещения. Я понимаю, что происходит в семантике перемещения, и это отличный инструмент. Но есть какое-то поведение, которое для меня не объяснимо. Когда я звоню в основную функцию DefaultConstructor testConstructor2 = std::move(testConstructor);
, мне нужно позвонить DefaultConstructor& operator=(DefaultConstructor&& def)
. Но Visual Studio 2015 вызывает конструктор перемещения.
int main()
{
std::vector<int> test = { 1, 2, 3, 4, 5 };
DefaultConstructor testConstructor(std::move(test));
DefaultConstructor testConstructor2 = std::move(testConstructor);
DefaultConstructor &testConstructor3 = DefaultConstructor({ 6, 7, 8, 9 });
DefaultConstructor testConstructor4 = std::move(testConstructor3);
swapMove(testConstructor, testConstructor2);
}
Хорошо, я подумал, что, возможно, оператор Move больше не нужен. Но я попробовал функцию SwapMove. Эта функция вызывает оператор = move.
template<typename T>
void swapMove(T &a, T &b)
{
T tmp(std::move(a));
a = std::move(b);
b = std::move(tmp);
}
Может кто-нибудь объяснить, в чем различие между двумя вызовами? Не должны быть вызовы a = std::move(b);
и DefaultConstructor testConstructor2 = std::move(testConstructor);
имеют такое же поведение?
'DefaultConstructor testConstructor2 = std :: move (testConstructor);' is initialisation, not assign. –
Заявить 'testConstructor2' отдельно заранее, например. 'DefaultConstructor testConstructor2 ({});' –
Джоната Поттер выглядит следующим образом. Спасибо. – PeterNL