我面临着 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 错误,没有对其进行诊断。
来自 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. ...
函数模板很好,因为函数模板的规则不同。如果参数包后面的模板参数可以通过调用处提供的参数推导出来,那么模板就可以了。
关于c++ - 为什么模板参数包必须在最后?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64967919/