我想知道是否需要符合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
警告)。