Как заявлено Леоном и Ли, 14.2 / 3 (C ++ '03) явно определяет это поведение.
C ++ '0x добавляет веселья с аналогичным правилом, применяемым к >>
. Основная концепция заключается в том, что при разборе списка аргументов шаблона не вложенный >>
будет обрабатываться как два отдельных токена >
>
, а не как оператор правого сдвига:
template <bool>
struct A {
A(bool);
A(void*);
};
template <typename T>
class C
{
public:
C (int);
};
int main() {
A<true> *d = 0;
const int b = 2;
const int c = 1;
new C <A< b >> (c) > (d); // #1
new C <A< b > > (c) > (d); // #2
}
'# 1' и '# 2' эквивалентны в приведенном выше.
Это, конечно, исправляет эту досаду из-за необходимости добавлять пробелы во вложенных специализациях:
C<A<false>> c; // Parse error in C++ '98, '03 due to "right shift operator"