Re[4]: Про перемещение (на примере кода)
От: rg45 СССР  
Дата: 15.03.25 19:35
Оценка:
Здравствуйте, rg45, Вы писали:

R>Как бы то ни было, хотя бы одного перемещения здесь не избежать. Поэтому смысла в этом локальном объекте tc нет никакого.


А раз уж хотя бы одного перемещения не избежать ни при каких раскладах, твоя функция-член take може спокойненько возвращать rvalue ссылку. И перемешение в этом случае будет происходить не в take, а в fun1:

TrackedClass&& take() {
    return std::move(_trackedClass); // Ни копии, ни перемещения - просто возврат rvalue ссылки.
}

TrackedClass fun1() {
    Wrapper w = Wrapper();
    return w.take(); // То самое одно неизбежное перемещение.
}


Но признаться, меня несколько напрягает такой дизайн. Вот нафига вот это безусловное встраивание move внутрь каждого неконстантного объекта? Не лучше ли просто обеспечить оптимальный доступ к члену класса в зависимости от категории выражения, а вызвающий метод уже пускай сам делает move, если захочет:

class Wrapper {
// . . .    
    const TrackedClass& get() const & { return _trackedClass; }
    TrackedClass&& get() && { return std::move(_trackedClass); }
};

TrackedClass fun1() {
    Wrapper w = Wrapper();
    return std::move(w).get(); // Клиент заказывает перемещение явно. И это хорошо!
}


И опять же, можно проще:

TrackedClass fun1() {
    return Wrapper().get(); // Перемещение автоматом, поскольку объект враппера временный.
}
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 16.03.2025 11:22 rg45 . Предыдущая версия . Еще …
Отредактировано 15.03.2025 20:22 rg45 . Предыдущая версия .
Отредактировано 15.03.2025 19:57 rg45 . Предыдущая версия .
Отредактировано 15.03.2025 19:40 rg45 . Предыдущая версия .
Отредактировано 15.03.2025 19:39 rg45 . Предыдущая версия .
Отредактировано 15.03.2025 19:36 rg45 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.