[英]Is a pointer to string literal guaranteed to be initialized before a std::string?
[英]Is std::cout guaranteed to be initialized?
我對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;
}
它打印
test::ctor
Hello world
test::dtor
代碼是否有可能無法按預期運行?
根據您使用的是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__;
解決此煩人的行為static std::ios_base::Init __unspecified_name__;
。 這將自動保證可以使用流。
根據§27.3/ 2 :
構造對象[std :: cin,std :: cout等],並在構造ios_base :: Init類的對象之前或第一次期間的某個時間以及在任何情況下,在建立之前建立關聯。主要主體開始執行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.