Как `>>>` лексируется в C ++ 0x? - PullRequest
25 голосов
/ 04 июня 2011

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

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

template<class T> struct X { };

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

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

Ответы [ 2 ]

11 голосов
/ 04 июня 2011

Текст FDIS гласит:

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

Он не может объединять токеныРЕЛЭКС.Так что это будет > > >.Обратите внимание, что входные данные для реализации C ++ сначала лексируются в токены предварительной обработки, а затем эти токены преобразуются в токены C ++.Итак, сначала вы вводите токены C ++ >> >, а затем синтаксический анализатор C ++ меняет их на > > >.

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

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

1 голос
/ 04 июня 2011

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

typedef X<int> X_int;
X_int >> 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...