Статья MSDN, How to: Write a Move Constuctor, имеет следующую рекомендацию.Внедрение конструктора перемещения путем вызова оператора назначения назначения
Если вы предоставите как конструктор перемещения и оператор присваивания для перемещения вашего класса, вы можете устранить избыточный код, написав движение конструктора для вызова оператора присваивания шага. Следующий пример показывает пересмотренную версию конструктора перемещения, что вызывает оператор присваивания шаг:
// Move constructor.
MemoryBlock(MemoryBlock&& other)
: _data(NULL)
, _length(0)
{
*this = std::move(other);
}
этот код неэффективен двойными инициализации значения MemoryBlock
«s, или компилятор сможет оптимизировать расстояние дополнительные инициализации? Должен ли я всегда писать конструкторы перемещения, вызывая оператор назначения перемещения?
Здесь есть несколько хороших советов, но я думаю, что этот ответ пренебрегает тем, что стоимость дублированного кода больше, чем всего 5 минут, потраченных на его запись второй раз - dup code имеет гораздо более значительные затраты, чем в отношении удобочитаемости, ремонтопригодности и надежности. В частности, когда имеется дублированный код, он предлагает очень распространенный тип ошибок: то есть, когда что-то фиксируется или изменяется в одном экземпляре кода, а не в другом. Будучи укушенным тем больше времени, чем мне было бы в жизни, я бы не дублировал код, если не существует * очень * убедительной доказанной причины. –
Производительность является одной из причин, но не единственной или самой важной. В большинстве случаев, когда я пишу оператор move move and move, это потому, что мой класс имеет уникальное право собственности на ресурс. Часто производительность не является проблемой, поэтому в этих случаях имеет смысл избежать дублирования. – opetroch
@ user779446: Спасибо, что разделили ваши приоритеты. Вот мои: http://howardhinnant.github.io/coding_guidelines.html –