#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
.