企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 右角括号 考虑如下代码: ``` 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)](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1757.html) . (翻译:张潇,dabaitu)