为什么GCC 6.3在没有明确的C++ 11支持的情况下编译这个Braced-Init-List代码?

Jon*_*Mee 13 c++ gcc initializer-list c++03 list-initialization

我有一个关于卷括号括号列表的不同含义的问题.

我知道C++ 03不支持C++ 11 initializer_list.然而,即使没有-std=c++11编译器标志,gcc 6.3 也会interpolate使用以下代码正确初始化:

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

我被问到为什么这会起作用,我意识到我没有答案.这是一个Brace-Init-List,但我们从初始化标准容器的方式通常是通过initializer_list.那么非C++ 11代码如何完成初始化呢?

Nat*_*ica 32

gcc 6.x-std=gnu++14默认编译器命令是,因此编译器使用更高版本的C++语言标准隐式编译代码.

您需要手动指定-std=c++03是否要在C++ 03中编译.

  • 一个更有趣的问题是为什么人们会期望一个新的编译器仍然默认为一个14岁的标准!无论如何,`g ++`6停止这样做的事实是一件好事,但我希望默认是`c ++ 14`,没有任何扩展; 否则,人们可能会认为默认情况下g ++允许的内容是明确定义的,但实际情况并非如此. (18认同)
  • 正如你所说的那样,@underscore_d并不是一个不合理的假设.选择默认值有两种基本策略:(A)使它们成为您最常想要的,或者(B)尽可能使它们成为故障安全.如果使用策略(B),则默认为C++ 03将是有道理的.这也有助于将现有代码库升级到更高版本的编译器,策略(A)会严重复杂化,假设使用该编译器编译的所有代码都是*new*代码.但完全同意不违反Gnu扩展名! (3认同)
  • @CodyGray对,好点.此外,期望默认标准将是...复古有一个先例:`g ++`5仍然默认为_C++ 98_,良好的's good! (3认同)