Как `>>>` лексируется в 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;