Невозможно переместить 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.