2017-06-20 6 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をサポートしていませんでしたことを知っています。しかし、でもこのコードのwill properly initialize interpolate 6.3 GCC -std=c++11コンパイラフラグ、なし:これがうまくいく理由について

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

私はこの質問には「ホットネットワーク質問」リストに加えられたことは非常に驚いています:|私は、これはよく私があまりにも少し驚いP0W @新しいgccの – P0W

+1

にgccとデフォルトのコンパイルフラグに関するインターネット上のいくつかの場所で文書化されたと思いました。私は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歳のStandard!とにかく、 'g ++ 6 'がそれをやめてしまったという事実はすばらしいことですが、デフォルトは' C++ 14'で、拡張子はありません。さもなければ、 'g ++ 'がデフォルトで許すものは、明確に定義されていることが保証されていると思われるかもしれませんが、そうではありません。 –

+3

あなたは@underscore_dであることを前提としているので、それは前提には不合理ではありません。デフォルトを選択するには2つの基本的な戦略があります:(A)最も頻繁に思っているものにするか、(B)できるだけフェールセーフにする。戦略(B)を使用した場合、C++ 03へのデフォルト設定は理にかなっています。これにより、既存のコードベースをコンパイラの新しいバージョンにアップグレードすることも容易になります。その戦略(A)は、そのコンパイラでコンパイルされているすべてのコードが* new *コードであると仮定すると、かなり複雑になります。しかし、Gnu拡張機能にデフォルト設定していないことに完全に同意しました! –

+3

@CodyGrayよかった、良い点。さらに、デフォルトの標準になると期待しています...ヴィンテージには先例があります: 'g ++' 5は、デフォルトではまだデフォルトの_C++ 98_です。 –

関連する問題