鉴于C ++ Primer对本地静态对象的描述:
拥有一个本地变量可能很有用,该变量的生命周期会持续调用该函数。我们通过将局部变量定义为静态来获取此类对象。 在第一次执行第一次执行对象的定义之前,初始化每个本地静态对象。当函数结束时,不会破坏局部静态;它们在程序终止时被销毁。
我很惊讶地发现下面的代码编译得很好而且有合理的输出:
#include <iostream>
using namespace std;
void test(int x){
static int y = x;
cout << y;
}
int main(){
test(2);
test(5);
test(6);
}
通过这样的描述,似乎使用函数参数初始化是不可能的或没有多大意义,如何在执行通过函数之前初始化y
,它将如何知道{{1}是吗?这是C ++ Primer的过度简化,还是我的程序可能出现编译器无法检测到的错误?
对于那些想知道为什么我可能尝试使用参数初始化静态变量的人,我试图创建一个函数,使用x
在每次调用时返回所提供范围内的随机整数(和因此需要default_random_engine
所以对象没有被销毁)作为C ++ Primer的另一个练习的一部分:
static
答案 0 :(得分:8)
您的来源很难选择“之前”这个词。 C ++标准描述了具有静态存储持续时间的块范围变量的初始化,如[stmt.dcl] / 4:
执行静态存储持续时间(3.7.1)或线程存储持续时间(3.7.2)的块范围变量的动态初始化第一次控制通过其声明;考虑这样的变量 初始化完成后初始化。如果通过抛出异常退出初始化,则初始化未完成,因此下次控制进入声明时将再次尝试初始化。如果控制 在初始化变量的同时进入声明,并发执行应等待初始化完成。
因此,当您第一次调用y
时,您的变量test
会初始化。