右角括号
考虑如下代码:
list<vector<string>> lvs;
在C++98中,这是一个语法错误,因为两个右角括号(‘>
’)之间没有空格(译注:因此,编译器会将它分析为”>>
”操作符)。C++0x可以正确地分辨出这是两个右角括号(‘>
’),是两个模板参数列表的结尾。
为什么之前这会是一个问题呢?一般地,一个编译器前端会按照“分析/阶段”模型进行组织。简要描述如下:
- 词法分析(从字符中构造token)
- 语法分析(检查语法)
- 类型检查(确定名称和表达式的类型)
这些阶段在理论上,甚至在某些实际应用中,都是严格独立的。所以,词法分析器会认为”>>
;”是一个完整的token(通常意味着右移操作符或是输入),而无法理解它的实际意义(译注:即在具体的上下文环境下,某一个符号的具体意义)。特别地,它无法理解模板或内置模板参数列表。然而,为了使上述示例“正确”,这三个阶段必须进行某种形式的交互、配合。解决这个问题的最关键的点在于,每一个C++ 编译器已完整理解整个问题(译注:对整个问题进行了全部的词法分析、符号分析及类型检测,然后分析各个阶段的正确性),从而给出令人满意的错误消息。
参考:
- the C++ draft section ???
- [N1757==05-0017] Daveed Vandevoorde: revised right angle brackets proposal (revision 2) .
(翻译:张潇,dabaitu)