递归下降解析器,变量与自身的初始化,困境
Recursive descent parser, initialization of variable with itself, dilemma
我想知道是否需要符合C++编译器才能支持以下代码:
int a(a); // no other a is visible, we mean initialization of a with itself
Visual Studio 2013不支持它(未声明的标识符),但是其他一些编译器会编译它。
这是我们的困境:对于可能的表达式检查,我们需要处理有关a
(包括其类型)的信息,因为它可以是表达式的一部分,但是还有另一种可能性是它是函数,在这种情况下,我们只是构造类型表达式(符号a
可能还没有在符号表中)。
我认为递归下降解析器更有可能在这种困境中运行,因为它本质上是非常结构性的,支持这种特定情况就像一个特殊的"拐杖"(当我们遇到()
内部a
并且我们处于某种递归级别时,正在构造类型表达式)。所以我假设Visual Studio使用递归下降策略。
因此,考虑到所有这些,是否值得编译器编写者的努力以及支持此类代码是否合理(尤其是在使用递归下降时)?
[basic.scope.pdecl]
名称的声明点在其完成后立即 声明符(第 8 条)及其初始值设定项(如果有)之前,但 下面注明。[ 示例:
unsigned char x = 12; { unsigned char x = x; }
在这里,第二个 x 使用它自己的(不确定)值进行初始化。—结束示例]
在int a(a);
中,声明符在初始值设定项的左大括号处结束,所以是的,编译器需要允许这样做(如果它是自动变量,GCC 会帮助给出-Wuninitialized
警告)。
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- C++使用整数的压缩数组初始化对象
- C++初始化基类
- 多成员Constexpr结构初始化
- 复制列表初始化的隐式转换的等级是多少
- 内联映射初始化的动态atexit析构函数崩溃
- 如何在C++中初始化嵌套类中的2个memeber
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 没有用于初始化C++中的变量模板的匹配构造函数
- 在未初始化映射的情况下,将值插入到映射的映射中
- C++成员初始化
- 为什么在C++中首先初始化成员类
- 同时具有"聚合初始化"和"模板推导"
- 初始化具有非默认构造函数的std::数组项的更好方法
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 在C和C++中初始化结构中的数组
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 在函数内部的声明中初始化数组,并在外部使用它
- 递归下降解析器,变量与自身的初始化,困境