2017-06-20 33 views
14

我對the different meanings of a curly-brace enclosed list有疑問。爲什麼GCC 6.3在沒有明確的C++ 11支持的情況下編譯這個Braced-Init-List代碼?

我知道C++ 03不支持C++ 11的initializer_list。然而,即使沒有-std=c++11編譯器標誌,GCC 6.3 will properly initialize interpolate與此代碼:

map<string, string> interpolate = { { "F", "a && b && c" }, { "H", "p^2 + w" }, { "K", "H > 10 || e < 5" }, { "J", "F && !K" } }; 

爲什麼這會工作I was challenged,我意識到我沒有答案。這是一個Brace-Init-List,但是我們從初始化標準容器的方式通常是通過initializer_list。那麼非C++ 11代碼將如何完成初始化?

+2

我很驚訝,這個問題提出'熱門網絡問題'列表:我認爲這是由海灣合作委員會和互聯網上的幾個地方很好的文檔記錄在新gcc的默認編譯標誌 – P0W

+1

@ P0W我也有點驚訝。當我問它時,我假設,與gcc 5中的默認行爲類似,我使用「-std = C++ 98」。我猜想很多人碰巧遇到誰有同樣的偏見。別擔心,我相信這只是一個畸變,常規的C++的投票率應儘快恢復。 –

回答

33

default compiler command for gcc 6.x is -std=gnu++14,所以編譯器使用更高版本的C++語言標準隱式編譯您的代碼。

如果您想在C++ 03中編譯,您需要手動指定-std=c++03

+18

一個更有趣的問題是爲什麼人們會期望一個新的編譯器仍然默認爲一個14歲的標準!無論如何,'g ++'6停止這樣做的事實是一件好事,但我希望默認是'C++ 14',沒有任何擴展;否則,人們可能會認爲'g ++'默認情況下允許保證明確定義,但情況並非如此。 –

+3

@underscore_d的假設並不是不合理的。選擇違約有兩種基本策略:(A)使它們成爲你認爲最經常需要的,或者(B)儘可能使它們儘可能安全。如果使用策略(B),那麼默認C++ 03會很有意義。這也有利於將現有的代碼庫升級到更高版本的編譯器,該策略(A)會嚴重複雜化,假設所有使用該編譯器編譯的代碼都是* new *代碼。不過,完全同意不違約Gnu擴展! –

+3

@CodyGray好,好點。此外,預期默認標準將是...... vintage有一個先例:'g ++'5仍默認爲_C++ 98_,fer good goodness'sakes! –

相關問題