C++ 为什么不是';是否可以将包含一个元组和一个唯一的ptr的元组作为C+中的值+;?
将C++ 为什么不是';是否可以将包含一个元组和一个唯一的ptr的元组作为C+中的值+;?,c++,pointers,stl,unique-ptr,stdtuple,C++,Pointers,Stl,Unique Ptr,Stdtuple,将std::unique\u ptr放在std::tuple中没有任何问题,但是当tuple包含另一个tuple以及unique\u ptr作为元素时,编译器会抛出错误。 例如: std::tuple tupleA{1,std::move(新实体)}; //这一行抛出了一个错误! std::tuple tupleB{{1,1},std::move(新实体)}; 第二行创建“tupleB”时抛出以下错误: error: no matching constructor for i
std::unique\u ptr
放在std::tuple
中没有任何问题,但是当tuple
包含另一个tuple
以及unique\u ptr
作为元素时,编译器会抛出错误。例如:
std::tuple tupleA{1,std::move(新实体)};
//这一行抛出了一个错误!
std::tuple tupleB{{1,1},std::move(新实体)};
第二行创建“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´
错误:没有用于初始化'std::tuple'的匹配构造函数
注意:候选构造函数模板不可行:无法将初始值设定项列表参数转换为“std::allocator\u arg\u t”
这里到底是什么问题?
std::forward\u as\u tuple(1,1)
而不是{1,1}
应该可以工作;DR
更改代码,使其可读
std::tuple<std::tuple<int, int>, std::unique_ptr<Derived>> tupleB{std::make_tuple(1,1), std::move(new Derived)};
std::tuple tuple{std::make_tuple(1,1),std::move(新派生)};
详细信息
您的编译器会告诉您出了什么问题。上面写着(本例中为MSVC)
错误C2440:“正在初始化”:无法从“初始值设定项列表”转换为“std::tuplestd::tuple”
因此,不要使用初始值设定项列表,而是像这样
std::tuple<std::tuple<int, int>, std::unique_ptr<Derived>> tupleB{std::make_tuple(1,1), std::move(new Derived)};
std::tuple tuple{std::make_tuple(1,1),std::move(新派生)};
问题如下:
当使用大括号内的值初始化容器时,如{1,1},这将被推断为类型
std::initializer\u list
。反过来,编译器会查找以初始值设定项列表作为参数的容器构造函数。不能使用初始值设定项列表来初始化元组,必须使用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::tuple tuple{std::make_tuple(1,1),std::move(新实体)};
使用std::make_tuple(1,1)
而不是{1,1}
在构造函数中尝试std::tuple{1,1}
应该是:auto tuple=std::make_tuple(std::make_tuple(1,1),std::make_unique()代码>
std::tuple<std::tuple<int, int>, std::unique_ptr<Entity>> tupleB {std::make_tuple<int, int>(1, 1), std::move(new Entity)};