为什么模板参数包必须在最后?
Why must the template parameter pack be last?
我面临 gcc10.2
和 clang11
之间的以下不一致:
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 错误,没有对其进行诊断。
... 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. ...
函数模板没问题,因为函数模板的规则不同。如果参数包后面的模板参数可以通过调用处提供的参数推导出来,那么模板就可以了。
我面临 gcc10.2
和 clang11
之间的以下不一致:
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 错误,没有对其进行诊断。
... 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. ...
函数模板没问题,因为函数模板的规则不同。如果参数包后面的模板参数可以通过调用处提供的参数推导出来,那么模板就可以了。