Ответ зависит от того, используете ли вы 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;
}
Теперь, когда создается test
, он инициализирует mInitializer
и гарантирует, что потоки готовы к использованию.
C ++ 11 исправил это немного раздражающее поведение, действуя так, как будто за каждым экземпляром #include <iostream>
следовал static std::ios_base::Init __unspecified_name__;
. Это автоматически гарантирует, что потоки готовы к использованию.