为什么 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的定义就完成了(也是一个声明),可以在它自己的初始化器中引用它。