Почему GCC 6.3 компилирует этот код Braced-Init-List без явной поддержки C++11?

У меня есть вопрос о различных значениях списка, заключенного в фигурные скобки.

Я знаю, что С++ 03 не поддерживает initializer_list С++ 11. Тем не менее, даже без флага компилятора -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" } };

Меня спросили, почему это сработает, и я понял, что у меня нет ответа. Это Brace-Init-List, но способ, которым мы переходим от него к инициализации стандартного контейнера, обычно осуществляется через initializer_list. Итак, как код, отличный от C++11, будет выполнять инициализацию?


person Jonathan Mee    schedule 20.06.2017    source источник
comment
Я очень удивлен, что этот вопрос попал в список «Горячих сетевых вопросов» :| Я думал, что это было хорошо задокументировано gcc и несколькими местами в Интернете о флагах компиляции по умолчанию в более новых gcc.   -  person P0W    schedule 20.06.2017
comment
@ P0W Я тоже немного удивлен. В то время, когда я спросил об этом, я предположил, что аналогично поведению по умолчанию в gcc 5, я использовал -std=c++98. Я предполагаю, что многие люди просто оказались на канале, у которых было такое же предубеждение. Не волнуйтесь, я уверен, что это была просто аберрация, обычное соотношение голосов против С++ должно быть восстановлено в ближайшее время.   -  person Jonathan Mee    schedule 20.06.2017


Ответы (1)


Командой компилятора по умолчанию для gcc 6.x является -std=gnu++14, поэтому компилятор неявно компиляция вашего кода с использованием более поздней версии стандарта языка C++.

Вам нужно будет вручную указать -std=c++03, если вы хотите скомпилировать в C++03.

person NathanOliver    schedule 20.06.2017
comment
Более интересный вопрос заключается в том, почему люди ожидают, что новый компилятор все еще будет по умолчанию использовать Стандарт 14-летней давности! В любом случае, тот факт, что g++ 6 перестал это делать, это здорово, но я бы хотел, чтобы по умолчанию было c++14, без каких-либо расширений; в противном случае люди могут предположить, что то, что g++ позволяет по умолчанию, гарантированно будет четко определено, что не так. - person underscore_d; 20.06.2017
comment
Это не такое необоснованное предположение, как вы его представляете, @underscore_d. Есть две основные стратегии выбора значений по умолчанию: (А) сделать их такими, какие вы считаете наиболее желательными, или (Б) сделать их максимально отказоустойчивыми. Если бы использовалась стратегия (B), то использование по умолчанию C++03 имело бы смысл. Это также облегчает обновление существующих баз кода до более поздней версии компилятора, что серьезно усложнит стратегия (A), предполагая, что весь код, компилируемый с помощью этого компилятора, является новым кодом. Однако полностью согласен не использовать расширения Gnu по умолчанию! - person Cody Gray; 20.06.2017
comment
@CodyGray Верно, хорошие моменты. Кроме того, ожидание того, что стандартом по умолчанию будет... винтаж, имеет прецедент: g++ 5 все еще по умолчанию используется C++98, ради всего святого! - person underscore_d; 20.06.2017
comment
@CodyGray Спасибо за улучшение. Да, я пытался быть хитрее и играть на перехитривших. - person NathanOliver; 20.06.2017