Переместить конструктор и список инициализации


Я хочу реализовать конструкторы перемещения (без конструктора копирования) для определенного типа, который должен быть типом значения в 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 6

1 ответ:

Скажи member(std::move(other.member)).

Как золотое правило, всякий раз, когда вы берете что-то по ссылке rvalue, вам нужно использовать его внутри std::move, и всякий раз, когда вы берете что-то по универсальной ссылке (т. е. выводимый шаблонный тип с &&), вам нужно использовать его внутри std::forward.