【问题标题】:Requires-clause appears after template template parameter: is this legal grammar?Requires-clause 出现在模板模板参数之后:这是合法的语法吗?
【发布时间】:2021-06-30 17:51:23
【问题描述】:

最近意外发现gcc和msvc接受如下代码(注意template-list中的requires-clause):

#include <vector>

template <template <class> requires true class>
void f() {}

int main() {
  f<std::vector>();
}

然后叮当rejects它的语法是:

<source>:3:28: error: template template parameter requires 'class' after the parameter list
template <template <class> requires true class>
                           ^

我应该信任哪个编译器?这段代码在语法上有效吗?

【问题讨论】:

  • 请记住,许多格式错误的程序都是合法的语法(例如,int x = "";)。我不确定您是在寻找具体的语法答案,还是在语义上也正确。

标签: c++ templates language-lawyer c++20 c++-concepts


【解决方案1】:

是的,这似乎是合法的语法。模板以template-head 开头,即

template &lt; template-parameter-list &gt; requires-clause opt

那么template-parameter-list就可以了

模板参数

template-parameter 可以在哪里

类型参数

然后type-parameter就可以了

模板头 类型参数键 ...opt标识符opt子>

现在这包括 template-head,它允许上面提到的 requires-clause

【讨论】:

    猜你喜欢
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多