Недавно я неожиданно обнаружил, что gcc и msvc принимают следующий код (обратите внимание на требует-пункт в списке шаблонов):
#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<template-parameter-list>requires-clauseopt
тогда шаблон-список-параметров может быть
template-parameter
где параметр-шаблон может быть
type-parameter
и тогда тип-параметр может быть
template-headtype-parameter-key
...optidentifieropt
Теперь это включает шаблон-голова, который позволяет использовать требует-пункт, как упомянуто выше.
Имейте в виду, что многие плохо сформированные программы являются юридической грамматикой (например,
int x = "";). Я не уверен, ищете ли вы ответ конкретно по грамматике или он также семантически правильный.