繁体   English   中英

对元组失败的向量使用可变参数模板参数

[英]Using a variadic template parameter for vectors of tuples failing

我正在使用g ++ 5.2。 为什么这样做?

void func(std::vector<std::tuple<int>> v)
{
    ...
}

func({ std::make_tuple(1), std::make_tuple(2), std::make_tuple(3) });

但这不是吗? 正如他们在逻辑上等同于我。

template <typename... Args>
void func(std::vector<std::tuple<Args...>> v)
{
    ...
}

func({ std::make_tuple(1), std::make_tuple(2), std::make_tuple(3) });

它给出了错误:

error: could not convert ‘{std::make_tuple(_Elements&& ...) [with _Elements = {int}](), std::make_tuple(_Elements&& ...) [with _Elements = {int}](), std::make_tuple(_Elements&& ...) [with _Elements = {int}]()}’ from ‘<brace-enclosed initializer list>’ to ‘std::vector<std::tuple<>, std::allocator<std::tuple<> > >’
func({ std::make_tuple(1), std::make_tuple(2), std::make_tuple(3) });
                                                                   ^

如果您实际上使用元组向量调用它们,则它们的行为在某种程度上等效,但是您不这样做。

void func(std::vector<std::tuple<int>> v)

它具有一个具有已知类型的参数,并且您可以将您使用的initializer-list转换为该类型,因此它可以工作。 您已经说过“该函数采用类型X,这是可转换为X的参数”。 编译器可以做到这一点。

template <typename... Args>
void func(std::vector<std::tuple<Args...>> v)

该函数模板必须推断出其参数类型。 但是,您不能使用元组向量来调用它,因为它可以推导元组元素类型。 您可以使用初始化列表来调用它,该列表可以转换为很多不同的类型(向量,列表,元组或许多其他类型)。 编译器在将initializer-list转换为该类型之前,无法推断出向量的类型,但是直到知道您使用的是哪种类型的向量,它才知道该转换是否有效,因此存在鸡与蛋的情况。 在进行转换之前,无法推断出类型,但是在知道类型之前,无法进行转换。

编译失败,因为无法从初始化列表中推导出函数模板参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM