С 2011 года у нас есть как копирование, так и перемещение. Однако этот ответ достаточно убедительно доказывает, что для классов управления ресурсами нужен только один оператор присваивания. Например, для std::vector
это будет выглядеть как
vector& vector::operator=(vector other)
{
swap(other);
return*this;
}
Важным моментом здесь является то, что аргумент берется значением. Это означает, что в настоящий момент вводится собственно тело функции, большая часть работы уже была выполнена конструкцией other
(по возможности, по возможности, с помощью конструктора копирования). Следовательно, это автоматически реализует как правильное копирование, так и перемещение.
Если это правильно, почему (согласно эта документация как минимум) std::vector
не реализовано таким образом?
изменить, чтобы объяснить, как это работает. Рассмотрим, что происходит с other
в приведенном выше коде в следующих примерах
void foo(std::vector<bar> &&x)
{
auto y=x; // other is copy constructed
auto z=std::move(x); // other is move constructed, no copy is ever made.
// ...
}