template <int>
using A = int;
void f(A<0>=0); // Attempting to declare a function f taking int,
// with the default argument 0
// Works as expected:
// void f(A<0> = 0);
Это не компилируется на GCC 4.9.2 или Clang 3.5 - не говоря уже о ICC или VС++. По-видимому, бит >=
анализируется как оператор большего или равного. Однако это, по-видимому, неверно в отношении [temp.names]/3:
После поиска имени (3.4) обнаружено, что имя является именем шаблона или идентификатор-оператор-идентификатор или идентификатор-буква - оператор-идентификатор относится к набору перегруженных функций, любой из которых является шаблоном функции, если за этим следует
<
,<
всегда принимается за разделитель список шаблонов-аргументов и никогда не меньше, чем оператор. При анализе списка шаблонов-аргументов первый не-вложенный>
138 принимается за конечный разделитель, а не больше оператора. [..] [Пример:template<int i> class X { /* ...*/ }; X< 1>2 > x1; // syntax error X<(1>2)> x2; // OK
- конец примера]
138) A
>
, который включает идентификатор типа adynamic_cast
,static_cast
,reinterpret_cast
илиconst_cast
, или который охватывает template-arguments следующего идентификатора шаблона, считается вложенным для целей этого описания.
Я что-то упустил или это ошибка компилятора?