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

问题描述 投票:0回答:1

以下程序编译并运行得很好。

#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进行了编译,但是这似乎在我尝试使用的所有标准版本上都可以正常工作。

c++ standards
1个回答
3
投票

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

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

因此,一旦它到达=foo的定义是完整的(这也是一个声明),它可以在它自己的初始化器中引用。

© www.soinside.com 2019 - 2024. All rights reserved.