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);