[英]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.