Подтвердить что ты не робот

Как `>>>` lexed в С++ 0x?

>>> лексируется как >> >. Но что произойдет, если первый > закрывает список аргументов шаблона, должен ли результат быть эквивалентен > > > или > >>?

Это имеет значение в следующем коде:

template<class T> struct X { };

void operator >>(const X<int>&, int) { }

int main() {
    *new X<int>>> 1;
}
4b9b3361

Ответ 1

В тексте FDIS говорится:

Аналогично, первое не-вложенное → рассматривается как два последовательных, но разных > токена

Он не может делить токены и релекс. Таким образом, это будет > > >. Обратите внимание, что ввод в реализацию С++ сначала лексируется в токены предварительной обработки, а затем эти токены преобразуются в токены С++. Итак, сначала ваш ввод - токены С++ >> >, тогда парсер С++ изменит их на > > >.

Каждый токен предварительной обработки преобразуется в токен. (2.7). Результирующие маркеры синтаксически и семантически анализируются и переводятся как единица перевода. [Примечание: процесс анализа и перевода токенов может иногда приводить к замене одного токена на последовательность других токенов (14.2). - конечная нота]

Нет никаких шансов, что вы можете объединить эти два трейлинг-текса > >.

Ответ 2

В этом конкретном фрагменте кода я понимаю, что он будет > >>. Парсер жадный и будет пытаться объединить как можно больше в каждый отдельный токен, когда встречается первый >, контекстное правило будет определять, что это полный токен, и что он не должен пытаться разбирать больше, но один раз он находится вне контекста аргументов шаблона, он будет анализировать остальные, следуя общим правилам, как если бы он был X<int> >> или

typedef X<int> X_int;
X_int >> 1;