Передача по значению в конструкторе копирования помогает только тогда, когда аргумент является подвижным, в противном случае вы можете получить до двух копий (одну для передачи аргумента, одну для конструкции члена).Поэтому я бы сказал, что лучше написать копию и конструктор перемещения отдельно.
Передача по значению имеет смысл для оператора присваивания, если у вас правильно реализована функция swap
, хотя:
Foo & operator=(Foo other) { this->swap(std::move(other)); }
Теперь, если other
является подвижным, конструктор перемещения Foo
входит во время создания аргумента, а если other
просто копируется, то одна необходимая копия создается во время создания аргумента, но в обоих случаях выиспользовать движущуюся версию swap
, которая должна быть дешевой.Но это зависит от существования конструктора перемещения!
Так что обратите внимание, что из «конструкции», «свопа» и «назначения» вам придется правильно реализовать два, и только третий может воспользоваться преимуществамидругие два.Поскольку swap
должен быть безбросковым, использование трюка подкачки в операторе присваивания является в основном единственным вариантом.