我想知道是否需要符合C ++编译器来支持以下代码:
int a(a); // no other a is visible, we mean initialization of a with itself
Visual Studio 2013不支持它(未声明的标识符),但是其他一些编译器会对其进行编译。
这就是我们的困境:对于可能的表达式检查,我们需要处理有关a
的信息(包括它的类型),因为它可以是表达式的一部分,但是在这种情况下还有另一种可能性,它是函数我们只构造类型表达式(符号a
可能还没有在符号表中)。
我认为递归下降解析器更有可能在这种困境中运行,因为它本质上是非常结构化的,支持这种特定情况就像一个特殊的“拐杖”(当我们遇到{{1时,正在构造类型表达式在a
内部,我们处于某种递归水平)。所以我假设visual studio使用递归下降策略。
考虑到这一切,是否值得编译器编写者的努力以及是否有理由支持这样的代码(特别是在使用递归下降时)?
答案 0 :(得分:1)
[basic.scope.pdecl]
名称的声明点在完成后立即生效 声明者(第8条)和初始化器之前(如果有的话),除了 如下所述。 [示例:
unsigned char x = 12; { unsigned char x = x; }
这里第二个x用它自己的(不确定的)值初始化。 -end example ]
在int a(a);
中,声明符结束于初始化程序的左括号,所以是的,编译器需要允许这个(如果它是一个自动变量,GCC会帮助发出-Wuninitialized
警告)。