Я понимаю, что экспериментальные функции языка программирования не должны включаться по умолчанию, поэтому я приветствую флаги -std=c++0x
и -std=c++1y
. Однако С++ 11 теперь стандартен с тех пор как пару лет. Почему компиляторам по-прежнему требуется -std=c++11
, чтобы включить поддержку своих функций?
Почему поддержка компилятора С++ 11 по-прежнему требует наличия флага?
Ответ 1
С++ 11 был стандартным для пары лет, но компилятор не переключит свой режим по умолчанию на С++ 11, пока:
- При абсолютном минимуме поддержка С++ 11 завершена в этом компиляторе и библиотеках, которые он использует. А также стабильный, если автор компилятора вообще не имеет никакого отношения к надежности.
- Желательно, чтобы в компиляторе увеличилось число основных версий, поскольку С++ 11 не полностью совместим с С++ 03.
- В идеале, в хорошо известном расписании, чтобы пользователи могли подготовиться к изменениям.
В принципе, многие люди (и make файлы) полагаются на компилятор, являющийся совместимым компилятором С++ 03, или, по крайней мере, на его несоответствие, известное. Поскольку С++ 11 вводит новые экземпляры несоответствия С++ 03, это изменение потенциально травматично.
Возможно, любой, кто полагается на С++ 03, должен был указать вариант, чтобы сказать это, и изменения в режиме по умолчанию не будут иметь для них никакого значения. Но как только вы задокументировали свой компилятор по умолчанию, люди будут полагаться на это, намеренно или иначе.
Для gcc, в частности, на странице руководства 4.8.2 говорится, что "поддержка С++ 11 все еще экспериментальна". Поэтому я думаю, что в конечном итоге ответ на ваш вопрос может заключаться в том, что для правильного внедрения С++ 11 требуется более двух лет, даже начиная со всей работы, выполненной с помощью проектов стандартов.
Ответ 2
Небольшое обновление. GCC 6.1 и выше используют режим С++ 14 по умолчанию [источник].