为什么 C++ 允许您在初始定义中引用已声明的变量?
Why does C++ allow you to reference a declared variable in the initial definition?
下面的程序可以正常编译和运行。
#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);
哪个更有意义。
然而,最初的陈述让我有点崩溃,因为我认为 RHS 在 LHS(或整体陈述)被执行之前被评估——在这种情况下可能表明 foo
没有还存在。
但是,我的假设是 size_t foo
总是首先产生一个声明,在编译时分解成它自己的语句,然后是定义。
我的假设正确吗? governed/well 是否在规范中定义?如果有,是哪个部分?我意识到我是用 -ansi
编译的,但这似乎在我尝试过的所有标准版本上都没有错误。
您正在寻找 [basic.scope.pdecl]:
The point of declaration for a name is immediately after its complete declarator (Clause 11) and before its initializer (if any), except as noted below.
所以一旦到达=
,foo
的定义就完成了(也是一个声明),可以在它自己的初始化器中引用它。
下面的程序可以正常编译和运行。
#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);
哪个更有意义。
然而,最初的陈述让我有点崩溃,因为我认为 RHS 在 LHS(或整体陈述)被执行之前被评估——在这种情况下可能表明 foo
没有还存在。
但是,我的假设是 size_t foo
总是首先产生一个声明,在编译时分解成它自己的语句,然后是定义。
我的假设正确吗? governed/well 是否在规范中定义?如果有,是哪个部分?我意识到我是用 -ansi
编译的,但这似乎在我尝试过的所有标准版本上都没有错误。
您正在寻找 [basic.scope.pdecl]:
The point of declaration for a name is immediately after its complete declarator (Clause 11) and before its initializer (if any), except as noted below.
所以一旦到达=
,foo
的定义就完成了(也是一个声明),可以在它自己的初始化器中引用它。