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

标签 c++ gcc compiler-errors clang variadic-templates

我面临着 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. ...

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

关于c++ - 为什么模板参数包必须在最后?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64967919/

相关文章:

带有 OR 运算符的 C++ if 语句无法正常工作

c++ - 在子类中重用工厂类型构造函数

c++ - 如何在 C++ 中获取 TIME,最好是多平台

java - 为什么在静态方法中引用字段时不能使用关键字 "this"?

function - Haskell-使用用户输入调用所有其他功能的主要功能

c++ - 记录重新抛出错误的函数

c++ - 从源代码 : configure: error: C compiler cannot create executables 构建 gcc 5.2.0

gcc - gcc如何找到as,ld和其他binutils可执行文件?

无法编译C库

java - 错误: cannot find symbol java for inner class