Requires-clause出现在模板模板参数之后:这是合法的语法吗?
最近意外发现gcc和msvc接受如下代码(注意template-list中的requires-clause):
#include <vector>
template <template <class> requires true class>
void f() {}
int main() {
f<std::vector>();
}
和 clang拒绝它的语法:
<source>:3:28: error: template template parameter requires 'class' after the parameter list
template <template <class> requires true class>
^
我应该信任哪个编译器?这段代码在语法上有效吗?
回答
是的,这似乎是法律语法。模板以模板头开始,它是
template<模板参数列表>需要子句 选择
那么模板参数列表可以是
模板参数
其中模板参数可以是
类型参数
然后类型参数可以是
模板头 类型参数键
...选择 标识符选择
现在这包括模板头,它允许如上所述的要求子句。