gpt4 book ai didi

c++ - 推导忽略的参数包

转载 作者:行者123 更新时间:2023-11-28 05:15:26 24 4
gpt4 key购买 nike

为什么我的 gcc-5.4.0 不能如果参数包没有出现在函数参数列表的末尾,则不推导出参数包?调用 works以正确的方式推导为works<int,int,int> , 调用 fails没有推导,而是只假设一个空参数包。导致出现有关为该函数提供的参数过多的错误消息。

#include <iostream>

template <typename...args_t>
void works (int first, args_t...args) {
std::cout << __PRETTY_FUNCTION__ << std::endl;
}

template <typename...args_t, typename last_t, typename=void>
void fails (args_t...args, last_t last) {
std::cout << __PRETTY_FUNCTION__ << std::endl;
}

int main () {
works (0, 1, 2, 3);
fails (0, 1, 2, 3);
return 0;
}

编辑:正如答案所解释的那样,不允许在参数包之后有类型名。但是根据cppreference.com ,如果可以推导出其他模板参数,那么在它之后应该是有效的。显然,给定的例子不能用我的 gcc 编译。 .取而代之的是,它仍然存在关于太多给定参数的相同错误。

#include <iostream>
template <typename...args_t, typename U, typename=void>
static int valid (args_t...args, U u) {
std::cout << __PRETTY_FUNCTION__ << std::endl;
return u;
}

int main () {
return valid(0, 0.0, -1, 3u);
}

最佳答案

Why can't my gcc-5.4.0 not deduce parameter packs if they do not appear in the end of the argument list of a function?

因为你不能像那样指定可变参数包之外的任何类型

 void fails (args_...args, int last)
// ^^^^^^^^^^

这只是与默认参数值或普通省略号 (...) 相同的问题,它们需要在参数列表的末尾打开(或者说它们需要是最后一个元素):

 void fails(int x = 0, int last);
void fails(int x, ..., int last);

关于c++ - 推导忽略的参数包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42748807/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com