无法移动 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)
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.
以下代码
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)
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
您可以使用 static_assert 检查 is_copy_constructible ... 是否为假,参见 coliru
我能想到的最简单的解决方法是改用 shared_ptr 并仍然调用 std::move.