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