Невозможно переместить std::any

Следующий код

using vptr = std::vector<std::unique_ptr<int>>;
auto m = std::unordered_map<int, std::any>{};
m.try_emplace(0, move(vptr{}));

Не компилируется, жалуется на использование конструктора удаленных копий unique_ptr, После замены std::any с vptr в аргументе шаблона этот код компилируется, поэтому проблема явно any

Как я могу заставить std::any быть перемещенным вместо скопированного?

1 ответ

Проблема не в перемещении std::any, а в том, что сам std:: any не поддерживает типы только для перемещения (например, std:: unique_ptr)

согласно концепции

template< class ValueType >
any( ValueType&& value );

Создает объект с начальным содержимым объекта типа std::decay_t< ValueType>, напрямую инициализируется из std::forward< ValueType>(value), Если std::is_copy_constructible< std::decay_t< ValueType>>::value является false программа некорректна

Вы можете проверить, что is_copy_constructible... ложно с static_assert, см. На Coliru

Самый простой обходной путь, о котором я могу подумать, - это использовать shared_ptr и при этом вызывать std::move.

Другие вопросы по тегам