Возможно ли переместить элемент из std ::set?

#c #c 11

#c #c 11

Вопрос:

Если у меня есть объект, который допускает только семантику перемещения — возможно ли перемещать элементы из набора? Кажется, я не могу найти способ сделать это.

Комментарии:

1. @cppguy Элементы набора неизменяемы, поэтому замена или перемещение не должны работать.

2. @juanchopanza Это, кажется, работает?

3. Это работает, потому std::string что может использоваться запасной вариант для копирования семантики.

4. @juanchopanza Хех, я тебе доверяю 🙂

5. C 17 может сделать это с помощью extract и merge

Ответ №1:

В C 17 добавлена функция std::set<>::extract , позволяющая перемещать объект из набора:

 std::set<MoveOnlyType> s;
s.emplace(arg0, arg1, arg2); // only way to insert such move-only objects, since C  11
auto internal_node = s.extract(s.begin()); // internal_node no longer part of set, we can do with it what we want
MoveOnlyType m = std::move(internal_node.value()); // finally get the actual object out
  

Ответ №2:

Нет, это невозможно. Невозможно получить неконстантный доступ к элементам в a set , а для перемещения требуются неконстантные ссылки. Разрешение неконстантного доступа сделало бы тривиально простым нарушение инвариантов set .