我想知道是否需要符合标准的 C++ 编译器来支持以下代码:
int a(a); // no other a is visible, we mean initialization of a with itself
Visual Studio 2013 不支持它(未声明的标识符),但是其他一些编译器会编译它。
这是我们的困境:为了可能的表达式检查,我们需要处理关于 a
的信息(包括它的类型),因为它可以是表达式的一部分,但是还有另一种可能性,它是函数,在这种情况下,我们只是构造类型表达式(并且符号 a
可能还不在符号表中)。
我认为递归下降解析器更有可能在这种困境中运行,因为它本质上是非常结构化的,支持这种特定情况就像一个特殊的“拐杖”(当我们遇到 时正在构造类型表达式a
inside ()
并且我们处于某种递归级别)。所以我假设 visual studio 使用递归下降策略。
考虑到所有这些,是否值得编译器编写者付出努力,支持此类代码是否合理(尤其是在使用递归下降时)?
最佳答案
[basic.scope.pdecl]
The point of declaration for a name is immediately after its complete declarator (Clause 8) and before its initializer (if any), except as noted below. [ Example:
unsigned char x = 12; { unsigned char x = x; }
Here the second x is initialized with its own (indeterminate) value. —end example]
在 int a(a);
中,声明符在初始化器的左大括号处结束,所以是的,编译器需要允许这样做(GCC 提供了一个有用的 -Wuninitialized
警告如果它是一个自动变量)。
关于c++ - 递归下降解析器,用自身初始化变量,困境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36884905/