C++ 参数包被演绎忽略
为什么我的C++ 参数包被演绎忽略,c++,c++11,g++,variadic-templates,C++,C++11,G++,Variadic Templates,为什么我的gcc-5.4.0不能推断参数包,如果它们没有出现在函数的参数列表的末尾?虽然对工作的调用以正确的方式推导到工作,但对的调用失败不会被推导出来,而是只假设一个空参数包。导致关于函数提供的参数过多的错误消息 #include <iostream> template <typename...args_t> void works (int first, args_t...args) { std::cout << __PRETTY_FUNCTION
gcc-5.4.0
不能推断参数包,如果它们没有出现在函数的参数列表的末尾?虽然对工作
的调用以正确的方式推导到工作
,但对的调用失败
不会被推导出来,而是只假设一个空参数包。导致关于函数提供的参数过多的错误消息
#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;
}
为什么我的gcc-5.4.0
不能推断参数包,如果它们没有出现在函数的参数列表的末尾
因为您不能像那样指定变量参数包之外的任何类型
void fails (args_...args, int last)
// ^^^^^^^^^^
这与默认参数值或纯省略号(…
)的问题相同,这些值需要在参数列表末尾打开(或者说它们必须是最后一个元素):
你是在问这些是规则还是为什么是规则?因为
gcc
没有编译它,我希望它是规则。由于我找不到任何关于这一点的原因,我很高兴听到原因是什么。当然,我也希望能找到一种绕过它的方法。。(;@Jonas它与其他编译器以同样的方式失败。Cppreference已修复(它获得的函数参数顺序错误)
void fails (args_...args, int last)
// ^^^^^^^^^^
void fails(int x = 0, int last);
void fails(int x, ..., int last);