Inb*_*ong 40 c++ constructor global-variables
我对C++的了解是不应该假设全局实例的构造(和析构)的顺序.
当我用编译器std::cout和析构函数中使用的全局实例编写代码时,我遇到了一个问题.
std::cout也是iostream的全局实例.是否std::cout保证在任何其他全局实例之前进行初始化?
我写了一个简单的测试代码,它工作得很好,但我仍然不知道为什么.
#include <iostream>
struct test
{
test() { std::cout << "test::ctor" << std::endl; }
~test() { std::cout << "test::dtor" << std::endl; }
};
test t;
int main()
{
std::cout << "Hello world" << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它打印
test::ctor
Hello world
test::dtor
Run Code Online (Sandbox Code Playgroud)
代码是否有可能无法按预期运行?
GMa*_*ckG 43
答案取决于您使用的是C++ 03还是C++ 11.
在C++ 11中,您的代码保证可以正常工作,但在C++ 03中,它是未指定的; 您唯一的保证是,在main()输入时,标准流已初始化.(也就是说,所有主流实现在运行任何动态初始化之前都会初始化它们,使它们可以正常使用.)
您可以通过构造std::ios_base::Init对象来强制初始化,如下所示:
#include <iostream>
struct test
{
test() { std::cout << "test::ctor" << std::endl; }
~test() { std::cout << "test::dtor" << std::endl; }
private:
std::ios_base::Init mInitializer;
};
test t;
int main()
{
std::cout << "Hello world" << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在,当test构造时,它初始化mInitializer并保证流已准备好使用.
C++ 11修复了这种有点烦人的行为,就好像每个实例#include <iostream>都跟着一样static std::ios_base::Init __unspecified_name__;.这可以自动保证流可以使用.
Gui*_*e07 11
根据§27.3/ 2:
构造对象[std :: cin,std :: cout等],并且在第一次构建类ios_base :: Init的对象之前或期间的某个时间建立关联,并且在任何情况下都在主体开始执行.
| 归档时间: |
|
| 查看次数: |
5013 次 |
| 最近记录: |