以下程序编译并运行得很好。
#include <iostream>
using namespace std;
int main() {
size_t foo = sizeof(foo);
cout << foo << endl;
return 0;
}
使用编译命令
clang++ -o wut -Wall -Wextra -Werror -pedantic -ansi test.cc
我明白这可能相当于
size_t foo;
foo = sizeof(foo);
这更有意义。
然而,由于我认为在执行LHS(或整体陈述)之前评估RHS,初始陈述有点让我心烦意乱 - 在这种情况下可能表明foo
尚不存在。
但是,我的假设是size_t foo
总是先生成一个声明,在编译时将其分解为自己的声明,然后是定义。
我的假设是否正确?这是否在规范中受到管理/定义?如果是的话,哪个部分?我意识到我使用-ansi
进行了编译,但是这似乎在我尝试使用的所有标准版本上都可以正常工作。
您正在寻找[basic.scope.pdecl]:
声明的声明在其完整的声明者(第11条)之后和初始化者(如果有的话)之前,除非如下所述。
因此,一旦它到达=
,foo
的定义是完整的(这也是一个声明),它可以在它自己的初始化器中引用。