Следующий код
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
перемещаться, а не копироваться?
Проблема не в перемещении std::any, а в том, что сам std::any не поддерживает типы только для перемещения (например, std::unique_ptr)
согласно cppreference
template< class ValueType >
any( ValueType&& value );
Constructs an object with initial content an object of type
std::decay_t< ValueType>
, direct-initialized fromstd::forward< ValueType>(value)
. Ifstd::is_copy_constructible< std::decay_t< ValueType>>::value
isfalse
, the program is ill-formed
Вы можете проверить, что is_copy_constructible... является ложным с помощью static_assert, см. колиру
Самый простой обходной путь, который я могу придумать, — это использовать вместо этого shared_ptr и по-прежнему вызывать метод std::move.
Обратите внимание, что вам не нужно делать
move(vptr{})
,vptr{}
уже является rvalue.