requires-clause出现在template模板参数之后:这是合法的语法吗?

Requires-clause appears after template template parameter: is this legal grammar?

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

#include <vector>

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

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

并且 clang rejects 其语法为:

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

我应该信任哪个编译器?此代码在语法上是否有效?

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

template < template-parameter-list > requires-clause opt

那么一个template-parameter-list就可以

template-parameter

其中 template-parameter 可以是

type-parameter

然后type-parameter可以

template-head type-parameter-key ...opt identifieropt

现在这包括 template-head,它允许 requires-clause 如上所述。