std :: cout保证被初始化?

我对C ++的了解是,全局实例的构造(和破坏)的顺序不应该被假定。

当我用构造函数和析构函数中使用std::cout的全局实例编写代码时,我有一个问题。

std::cout也是iostream的一个全局实例。 std::cout保证在任何其他全局实例之前被初始化?

我写了一个简单的testing代码,它完美的工作,但我仍然不知道为什么。

 #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; } 

它打印

 test::ctor Hello world test::dtor 

有没有可能的代码不按预期运行?

答案因使用C ++ 03或C ++ 11而异。

在C ++ 11中,你的代码是有保证的,但在C ++ 03中是没有指定的; 您唯一的保证是在进入main()的时候,标准stream已经被初始化了。 (也就是说,所有主stream实现在运行任何dynamic初始化之前初始化它们,使它们可以很好地使用。)

你可以通过构build一个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; } 

现在,当test构造时,它初始化mInitializer并保证stream已准备好使用。

C ++ 11通过充当#include <iostream>其中static std::ios_base::Init __unspecified_name__;后面的每个实例来解决这个稍微令人讨厌的行为static std::ios_base::Init __unspecified_name__; 。 这自动保证了stream可以使用。

根据§27.3/ 2

构造对象[std :: cin,std :: cout等],并且在第一次构buildios_base :: Init类的对象之前的某个时间build立关联,并且在任何情况下主体开始执行。

你的问题是关于静态对象构造的顺序。 我相信语言规范使其不确定。

GCC具有init_priority属性来与订单一起玩。

我相信在实践中你不应该担心。