为什么不能将包含元组和unique_ptr的元组作为C++中的值?



std::unique_ptr放入std::tuple中没有任何问题,但当tuple包含另一个tupleunique_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}

相关内容

  • 没有找到相关文章

最新更新