c++ - 在 C++ 标准中的什么地方可以找到对在全局范围内调用函数的支持?

标签 c++ language-lawyer

考虑下面的片段:

#include <iostream>
int f(int i) {
    return ++i;
}
int i = f(i);

int main() {
    std::cout << i << '\n';
}

在 C++ 标准中,我可以在哪里找到对上面的全局变量 i 的初始化的支持?

最佳答案

非局部变量的初始化在标题为“非局部变量的初始化”[basic.start.init] 的章节中进行了描述。在 C++11 中,这是 3.6.2。

使用 = 进行初始化,初始化器可以是花括号列表或任何赋值表达式,包括函数调用,如 [dcl.init] (C++11 8.5) 中所指定。

它具有静态存储持续时间,因此它首先在静态初始化期间根据 3.6.2/2 进行零初始化:

Variables with static storage duration [...] shall be zero-initialized before any other initialization takes place.

然后在动态初始化期间从其初始化器初始化它,因为它不符合常量初始化的条件(因为初始化器不是常量表达式)。它将静态初始化的零值传递给函数,该函数递增它并返回 1。该值 1 用于完成初始化。

关于c++ - 在 C++ 标准中的什么地方可以找到对在全局范围内调用函数的支持?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28563974/

相关文章:

C++ 参数类型接受适用于基于范围的 for 循环的所有序列

c++ - 加载 OBJ 时我得到这个

c++ - 为什么 OpenGL 着色器无法正确编译?

c++ - std::map 是否分配它的比较器?

c++ - 是否允许枚举具有未列出的值?

c++ - 为什么要在 C++ 程序中创建 abc.h 和 abc.cpp 文件?

c++ - glReadPixels() 设置 GL_INVALID_OPERATION 错误

c++ - struct 和 int 之间的 clang 重新定义不一致

c++ - 为什么在这里创建对 prvalue 的左值引用是合法的?

c++ - 类的友元声明中定义的函数名称是否具有链接?