Переместить конструктор и список инициализации
Я хочу реализовать конструкторы перемещения (без конструктора копирования) для определенного типа, который должен быть типом значения в boost::unordered_map
. Назовем этот тип Composite
.
Composite
имеет следующую подпись:
struct Base
{
Base(..stuff, no default ctor) : initialization list {}
Base(Base&& other) : initialization list {}
}
struct Composite
{
Base member;
Composite(..stuff, no default ctor) : member(...) {}
Composite(Composite&& other) : member(other.member) {} // <---- I want to make sure this invokes the move ctor of Base
}
Я хочу написать это так, что boost::unordered_map< Key , Composite >
не требует конструктора копирования, а просто использует конструктор перемещения. Если это возможно, я не хочу использовать конструктор копирования Base
в списке инициализации конструктора перемещения Composite
.
Возможно ли это?
1 ответ:
Скажи
Как золотое правило, всякий раз, когда вы берете что-то по ссылке rvalue, вам нужно использовать его внутриmember(std::move(other.member))
.std::move
, и всякий раз, когда вы берете что-то по универсальной ссылке (т. е. выводимый шаблонный тип с&&
), вам нужно использовать его внутриstd::forward
.