Здравствуйте, Shmj, Вы писали:
По существу
незаданного вопроса.
Не надо бояться промежуточных копирований, а тем более, промежуточных перемещений.
Если объект сам по себе не слишком большого размера, то даже если компилятор не оптимизирует размещение его промежуточных копий, то правильно написанный (а в ряде случаев — реализованный по умолчанию) конструктор перемещения не отнимет много процессорного времени.
Всякие там std::vector прекрасно перемещаются сами — передавая своё содержимое от одного экземпляра другому.
Объекты надо возвращать (и желательно, принимать тоже) по значению, а не по rvalue-ссылке.
Так ты с большей гарантией не получишь висячую ссылку, как в коде примера.
Соответственно, дизайн кода у обёртки — например, такой
TrackedClass Wrapper::take() { return std::move(_trackedClass); }
TrackedClass fun1() {
Wrapper w;
return w.take();
}
Здесь мы говорим, что ссылка на поле — временная, поэтому конструктор возвращаемого значения — это конструктор перемещения. То есть, можно украсть контент.
Если же объект реально тяжеловесный сам по себе, и не хочется морочить голову вопросами его перемещения — то умные указатели тебе в помощь. Заодно и работу со стеком разгрузишь.
std::unique_ptr не имеет конструктора копирования, так что заодно получишь диагностику от компилятора обо всех местах, где ты явно или неявно пытался копировать вместо перемещения. Ну и там, где нужно именно копирование, — сделаешь его руками.