这是一个效果最大蒙奇原理 http://en.wikipedia.org/wiki/Maximal_munch,它让词法分析器采用尽可能多的字符来形成有效的标记。 C++ 标准草案部分涵盖了这一点2.5
[lex.pptoken]其中说:
否则,下一个预处理标记是最长的序列
可以构成预处理标记的字符,即使
会导致进一步的词法分析失败。
任何情况(例如您上面引用的情况)都需要制定特定的例外情况,例如本例<::
,我们可以在下面的代码中看到一个例子:
template<typename T> class SomeClass;
class Class;
SomeClass<::Class>* cls;
其中涵盖这个问题 https://stackoverflow.com/q/3952648/1708801,例外情况列在最大咀嚼规则上方的项目符号中:
否则,如果接下来的三个字符是 <:: :>,则
当然还有非嵌套的>
你在问题中引用的。
注意我们可以看到>=
是来自节的预处理器标记2.13
[词法运算符]其中说:
C++ 程序的词法表示包括许多预处理标记,这些标记用于
预处理器的语法或转换为运算符和标点符号的标记:
并包括>=
在列表中。
>> 修复
从修正的提案中我们可以看到>>
case: N1757:直角括号 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1757.html其中说(强调我的):
自从引入尖括号以来,C++ 程序员就
两个连续的直角括号让我感到惊讶
必须用空格分隔:
#include <vector>
typedef std::vector<std::vector<int> > Table; // OK
typedef std::vector<std::vector<bool>> Flags; // Error
问题是一个“最大程度咀嚼”的直接后果
原则事实上 >> 在 C++ 中是一个有效的标记(右移)。
这个问题虽小,但持续存在,令人烦恼,而且有点
尴尬的问题。如果成本合理的话,看来
值得消除惊喜。
本文档的目的是解释如何让 >>
被视为两个右尖括号,以及讨论
由此产生的问题。提出了具体选项以及措辞
这将落实当前工作文件中的提案。
还指出>=
case:
还值得注意的是,这个问题可以也与 >>= 一起出现
和 >= 标记。例如
void func(List<B>= default_val1);
void func(List<List<B>>= default_val2);
目前这两种形式都是不正确的。可能需要
也解决了这个问题,但本文不建议这样做。
注意,这个改变破坏了与 C++03 的向后兼容性 https://stackoverflow.com/a/23063914/1708801.