Ответ 1
Этот эффект максимальный принцип клана, в котором лексический анализатор принимает как можно больше символов, чтобы сформировать действительный токен. Это описано в черновом стандартном разделе С++ 2.5
[lex.pptoken], в котором говорится:
В противном случае следующий токен предварительной обработки - это самая длинная последовательность символы, которые могут составлять токен предварительной обработки, даже если это приведет к сбою дальнейшего лексического анализа.
В любых случаях, например, приведенных выше, требуется определенное исключение, например, для этого случая для <::
, мы можем увидеть пример в следующем коде:
template<typename T> class SomeClass;
class Class;
SomeClass<::Class>* cls;
который рассматривается в этом вопросе, исключение указано в марке чуть выше максимального правила munch:
В противном случае, если следующие три символа: <:: и последующий символ не равен: nor > , < рассматривается как токен препроцессора сам по себе, а не как первый символ альтернативного токена <:.
и, конечно, не вложенные >
, которые вы цитируете в своем вопросе.
Заметьте, что >=
- токен препроцессора из раздела 2.13
[lex.operators], который гласит:
Лексическое представление программ на С++ включает в себя ряд токенов предварительной обработки, которые используются в синтаксис препроцессора или преобразуются в токены для операторов и пунктуаторов:
и включает >=
в список.
> fix
Из предложения, которое зафиксировано в случае >>
, мы можем видеть: N1757: Прямоугольные скобки, в котором говорится (выделено мной):
С момента появления угловых скобок программисты на C++ был удивлен тем, что два последовательных прямоугольных скобки должны быть разделены пробелами:
#include <vector> typedef std::vector<std::vector<int> > Table; // OK typedef std::vector<std::vector<bool>> Flags; // Error
Проблема заключается в <сильном > немедленном следствии "максимального munch" принцип и тот факт, что → - действительный токен (правый сдвиг) в С++.
Этот вопрос является второстепенным, но сохраняющим, раздражающим и несколько смущающая проблема. Если стоимость разумна, кажется, стоит устранить неожиданность.
Цель этого документа - объяснить способы, позволяющие → быть рассматриваются как две скобки для угла закрытия, а также для обсуждения возникающие проблемы. Предлагается конкретный вариант наряду с формулировкой который будет реализовывать это предложение в настоящем рабочем документе.
Также указывает случай >=
:
Также стоит отметить, что проблема может также возникать при → = и >= токены. Например
void func(List<B>= default_val1); void func(List<List<B>>= default_val2);
Обе эти формы в настоящее время плохо сформированы. Может быть желательно, чтобы также рассмотрите этот вопрос, но этот документ не предлагает этого.
Обратите внимание, что это изменение отменило обратную совместимость с С++ 03.