为什么模板参数包必须在最后?

Why must the template parameter pack be last?

我面临 gcc10.2clang11 之间的以下不一致:

template<typename ... Args, typename T>
static constexpr int fuu = sizeof(T);

clang 抱怨模板包必须是模板声明中的最后一件事:

error: template parameter pack must be the last template parameter
template<typename ... Args, typename T>  

但是 gcc 很酷。
参见 https://godbolt.org/z/v9KeW6

这个“最后一件事”实际上是一条规则吗?在一个函数中,这适用于两个编译器。

template<typename... Args, typename T>
int foo(T) {
    return sizeof(T);
}

我看不出第一个代码片段不起作用的原因,模板参数是明确可推导的。

变量模板声明格式不正确,这是一个 gcc 错误,没有对其进行诊断。

来自temp.param#14

... If a template-parameter of a primary class template, primary variable template, or alias template is a template parameter pack, it shall be the last template-parameter. ...

函数模板没问题,因为函数模板的规则不同。如果参数包后面的模板参数可以通过调用处提供的参数推导出来,那么模板就可以了。