无法移动 std::any

Cannot move 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 的已删除复制构造函数。在模板参数中用 vptr 替换 std::any 后,此代码编译,所以问题显然与 any

如何强制移动 std::any 而不是复制?

问题不是动std::any,而是std::any本身不支持move-only类型(例如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 from std::forward< ValueType>(value). If std::is_copy_constructible< std::decay_t< ValueType>>::value is false, the program is ill-formed

您可以使用 static_assert 检查 is_copy_constructible ... 是否为假,参见 coliru

我能想到的最简单的解决方法是改用 shared_ptr 并仍然调用 std::move.