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)};