【发布时间】:2021-03-06 03:19:55
【问题描述】:
我面临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);
}
我看不出第一个 sn-p 不起作用的原因,模板参数是明确可推导出的。
【问题讨论】:
-
如果你添加
int main () { fuu<int>; }你也会从 gcc 得到一个错误 -
是的,这也很奇怪,不是吗?
wrong number of template parameters. is one, should be at least one -
是的:奇怪又有趣。但实质是,对于一个模板参数列表,其中没有任何东西可以推导出来,所有东西都必须被解释,可变参数列表必须在最后。与
foo()函数不同,可以推导出T。 -
template<typename ... Ts> static constexpr std::size_t fuu = (sizeof(Ts, ...);使用 C++17 折叠表达式 :-) -
你知道这是从哪里来的吗?什么属于
Args,什么属于T,从给出的明确列表中可以清楚地看出..
标签: c++ gcc compiler-errors clang variadic-templates