为什么C ++允许您在初始定义中引用声明的变量?

时间:2017-12-22 03:50:09

标签: c++ standards

以下程序编译并运行正常。

#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进行了编译,但这似乎对我尝试过的所有标准版本都没有错误。

1 个答案:

答案 0 :(得分:3)

您正在寻找[basic.scope.pdecl]:

  

名称的声明点紧接在其完整的声明者(第11条)之后和初始化者之前(如果有的话),除非如下所述。

所以一旦它到达=foo的定义就完成了(这也是一个声明),它可以在它自己的初始化程序中引用。