在 C++ 中,如果我写 a < b > c
, meaning 可以是表达式语句 (a < b) > c
或 a<b>
类型变量 c 的声明.
为什么这不是 java 中的问题?是 (a < b) > c
被泛型废弃的选项,因为虽然它解析了,但它总是以类型错误结束? C++ 是否坚持保留此选项以实现向后兼容性?
最佳答案
出于不同的原因,对于 C++ 或 Java 来说,这并不是真正的问题。
在 Java 中,a < b > c;
只能是声明,因为任意表达式不能是 expression statements .可能的表达式语句列表不包括比较或算术表达式(前/后增量/减量除外),因此该语句必须是局部声明,并且在该上下文中 a
必须是通用类型。
在 C++ 中,一个 <
如果它跟在已声明为模板的标识符之后,则只能是模板括号,并且该声明需要先于标识符的使用。虽然这不是特别干净的设计(它需要一个上下文相关的解析器),但这个问题已经存在于 C 中,如果不知道标识符是否是类型别名就无法正确解析。 [注 1] 这基本上需要让词法扫描器访问符号表,并确保符号表至少包含有关每个标识符的“种类”(尽管不是类型/类)的准确信息。
注意事项
- 正如 Ira Baxter 指出的,上下文相关解析的替代方法是使用 GLR(或等效)解析引擎执行上下文无关解析,该引擎保留所有可能的解析。然后可以在解析之后通过语义分析来解决歧义。这当然是一种可以接受的策略,但我不认为这是语言设计者所考虑的策略,他们认为在使用类型和模板之前声明它们很重要。
关于java - 解析 - 为什么 C++ 在模板 var decls 上有问题而 java 在通用 var decls 上却没有?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47142417/