Как правильно вызывать мув ctor и мув operator= базового класса из производного?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 30.11.23 16:53
Оценка: :)
Здравствуйте!

Собсно, сабж

Просто вызвать, как обычный конструктор копирования/operator=, присунуть туда при вызове std::move, или ещё что-то?
Маньяк Робокряк колесит по городу
Re: Как правильно вызывать мув ctor и мув operator= базового
От: rg45 СССР  
Дата: 01.12.23 19:47
Оценка: 9 (3)
Здравствуйте, Marty, Вы писали:

M>Просто вызвать, как обычный конструктор копирования/operator=, присунуть туда при вызове std::move, или ещё что-то?


Конечно нужно присунуть move. Фишка в том, что внутри конструктора фактический параметр, пришедший по rvalue ссылке, превращается в lvalue выражение, и без move, в лучшем случае, возникнет ошибка компиляции, а в худшем — вызовется не тот конструктор (например, копирование вместо перемещения).

И для чистоты можно даже вместо move использовать forward для того, чтоб сразу привести аргумент к базовому классу — во избежание разного рода сюрпризов (мало ли, вдруг, в базовом классе объявлен шаблонный конструктор, принимающий perfect forwarding reference).

struct Base
{
    Base() = default;
    Base(Base&&) = default;
    
    template <typename T>
    Base(T&&);
};

struct Derived : Base
{
    Derived() = default;
    Derived(Derived&& rhs) : Base(std::forward<Base>(rhs)) {} // Будет использован Base(Base&&)
                                                              // При замене forward на move
                                                              // будет использован шаблонный Base(T&&)
};
--
Отредактировано 01.12.2023 20:12 rg45 . Предыдущая версия . Еще …
Отредактировано 01.12.2023 20:11 rg45 . Предыдущая версия .
Отредактировано 01.12.2023 20:10 rg45 . Предыдущая версия .
Отредактировано 01.12.2023 20:07 rg45 . Предыдущая версия .
Отредактировано 01.12.2023 19:58 rg45 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.