将std::unique_ptr
放入std::tuple
中没有任何问题,但当tuple
包含另一个tuple
和unique_ptr
作为元素时,编译器会抛出错误。
示例:
std::tuple<int, std::unique_ptr<Entity>> tupleA {1, std::move(new Entity)};
//this line throws an error!
std::tuple<std::tuple<int, int>, std::unique_ptr<Entity>> tupleB {{1, 1}, std::move(new Entity)};
第二行,创建' tupleB '抛出以下错误:
error: no matching constructor for initialization of ´std::tuple<std::tuple<int, int>,std::unique_ptr<Entity>>´
note: candidate constructor template not viable: cannot convert initializer list argument to ´std::allocator_arg_t´
这里到底是什么问题?
TL;DR
修改你的代码,使它读作
std::tuple<std::tuple<int, int>, std::unique_ptr<Derived>> tupleB{std::make_tuple(1,1), std::move(new Derived)};
你的编译器告诉你哪里出错了。它说(本例中是MSVC)
错误C2440: '初始化':无法从'初始化列表'转换为'std::tuplestd::tuple<int,int,std::unique_ptr><Derived,std::default_delete>>'
所以不使用初始化列表而是像这样
std::tuple<std::tuple<int, int>, std::unique_ptr<Derived>> tupleB{std::make_tuple(1,1), std::move(new Derived)};
问题如下:
当容器用括号内的值初始化时,如{1,1},则推断为std::initializer_lists<const char *>
类型。然后,编译器寻找一个接受初始化列表作为形参的容器构造函数。
std::forward_as_tuple(1, 1)
应该可以代替{1, 1}
。
您不能使用初始化列表来初始化元组,您必须使用std::make_tuple
,如下所示:
std::tuple<std::tuple<int, int>, std::unique_ptr<Entity>> tupleB {std::make_tuple<int, int>(1, 1), std::move(new Entity)};
用std::make_tuple(1, 1)
代替{1, 1}