gpt4 book ai didi

java - 解析 - 为什么 C++ 在模板 var decls 上有问题而 java 在通用 var decls 上却没有?

转载 作者:搜寻专家 更新时间:2023-10-31 00:08:45 24 4
gpt4 key购买 nike

在 C++ 中,如果我写 a < b > c , meaning 可以是表达式语句 (a < b) > ca<b> 类型变量 c 的声明.

为什么这不是 java 中的问题?是 (a < b) > c被泛型废弃的选项,因为虽然它解析了,但它总是以类型错误结束? C++ 是否坚持保留此选项以实现向后兼容性?

最佳答案

出于不同的原因,对于 C++ 或 Java 来说,这并不是真正的问题。

在 Java 中,a < b > c;只能是声明,因为任意表达式不能是 expression statements .可能的表达式语句列表不包括比较或算术表达式(前/后增量/减量除外),因此该语句必须是局部声明,并且在该上下文中 a必须是通用类型。

在 C++ 中,一个 <如果它跟在已声明为模板的标识符之后,则只能是模板括号,并且该声明需要先于标识符的使用。虽然这不是特别干净的设计(它需要一个上下文相关的解析器),但这个问题已经存在于 C 中,如果不知道标识符是否是类型别名就无法正确解析。 [注 1] 这基本上需要让词法扫描器访问符号表,并确保符号表至少包含有关每个标识符的“种类”(尽管不是类型/类)的准确信息。


注意事项

  1. 正如 Ira Baxter 指出的,上下文相关解析的替代方法是使用 GLR(或等效)解析引擎执行上下文无关解析,该引擎保留所有可能的解析。然后可以在解析之后通过语义分析来解决歧义。这当然是一种可以接受的策略,但我不认为这是语言设计者所考虑的策略,他们认为在使用类型和模板之前声明它们很重要。

关于java - 解析 - 为什么 C++ 在模板 var decls 上有问题而 java 在通用 var decls 上却没有?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47142417/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com