【问题标题】:Why must the template parameter pack be last?为什么模板参数包必须放在最后?
【发布时间】:2021-03-06 03:19:55
【问题描述】:

我面临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);
}

我看不出第一个 sn-p 不起作用的原因,模板参数是明确可推导出的。

【问题讨论】:

  • 如果你添加 int main () { fuu&lt;int&gt;; } 你也会从 gcc 得到一个错误
  • 是的,这也很奇怪,不是吗? wrong number of template parameters. is one, should be at least one
  • 是的:奇怪又有趣。但实质是,对于一个模板参数列表,其中没有任何东西可以推导出来,所有东西都必须被解释,可变参数列表必须在最后。与 foo() 函数不同,可以推导出 T
  • template&lt;typename ... Ts&gt; static constexpr std::size_t fuu = (sizeof(Ts, ...); 使用 C++17 折叠表达式 :-)
  • 你知道这是从哪里来的吗?什么属于Args,什么属于T,从给出的明确列表中可以清楚地看出..

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


【解决方案1】:

变量模板声明格式不正确,是 gcc 的错误,无法诊断。

来自temp.param#14

...如果主类模板、主变量模板或别名模板的模板参数是模板参数包,则它应为最后一个模板-范围。 ...

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-01
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 2012-08-07
    • 1970-01-01
    • 2016-11-15
    • 2023-04-07
    相关资源
    最近更新 更多