Как `>>>` лексируется в C++0x?

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

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

template<class T> struct X { };

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

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

2 ответа

Решение

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

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

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

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

Там нет шансов, что вы могли бы объединить эти два тянущихся > > жетоны.

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

typedef X<int> X_int;
X_int >> 1;
Другие вопросы по тегам