我在godbolt.org上四处游玩,并注意到编译器添加了一些带有包含iostream头的“空main()”的https://godbolt.org/g/lCBXF8。
在研究了标准之后,我认为,如果还没有构造/初始化对象cin、cout、cerr、clog、wcin、wcout、wcerr和wclog,,就需要这些标准来构造和初始化它们。
N4606:§27.5.3.1.6
27.5.3.1.6类ios_base::Init ios::Init命名空间std { Class ios_base::Init { public: Init();~Init();私有:静态int init_cnt;// ios_base::Init };}
但是对于static数据,所有的标准都表示它计算class Init的构造函数和析构函数调用的数量,并且初始化为零。
2为了说明起见,本文将维护的数据显示为:(2.1) -静态int init_cnt,对初始化为零的类Init计算构造函数和析构函数调用数。
我不明白的是,static int init_cnt;在这里的用途是什么?为什么我们需要计算调用构造函数/析构函数的次数?
发布于 2016-11-10 13:13:33
基于https://github.com/maniacbug/StandardCplusplus/blob/master/ios.cpp#L163,我认为,如果需要的话,在调用全局变量析构函数时,在结束时进行编程,可以正确地销毁cin、cout、cerr、clog、wcin、wcout、wcerr和clog。
来自http://www.csci.csusb.edu/dick/c++std/september/lib-iostreams.html:
~Init(); 效果:摧毁类Init中的一个对象。函数从存储在init_cnt中的值中减去一个,如果结果存储的值为一个,则调用cout.flush()、cerr.flush()、clog.flush()、wcout.flush()、wcerr.flush()、wclog.flush()。
https://stackoverflow.com/questions/40528228
复制相似问题