12 августа 2011 года Международная организация по стандартизации (англ. «ISO») утвердила новую версию языка C++ под названием C++11. Было добавлено много нового функционала, использовать который не обязательно, но который оказался очень даже полезным в определенных случаях.
Цели C++11
Бьёрн Страуструп охарактеризовал цели C++11 следующим образом:
- Укрепить сильные стороны языка C++, нежели пытаться захватить те области, в которых язык С++ слаб (например, приложения Windows с «тяжелым» графическим интерфейсом). Сосредоточиться на том, чтобы заставить язык С++ делать еще лучше то, что у него и так хорошо получается
- Сделать язык C++ легче в изучении, использовании и обучении, предоставить функционал, который сделает язык более простым в использовании
Руководствуясь этими целями, комитет, который согласовывал версию С++11, постарался выполнить следующее:
- Поддерживать стабильность и совместимость со старыми версиями языков C++ и Cи (насколько это возможно). Программы, которые работали под C++03 должны работать и под C++11
- Свести к минимуму количество основных расширений языка С++. Внести большую часть изменений в Стандартную библиотеку С++ (эта цель не была достигнута в полной мере)
- Сосредоточиться на улучшении механизмов абстракции (классы, шаблоны), нежели на добавлении механизмов обработки конкретных случаев (которые случаются нечасто)
- Повысить безопасность типов данных
- Повысить производительность и позволить языку C++ напрямую работать с оборудованием
- Рассмотреть вопросы юзабилити и экосистемы. Язык C++ должен хорошо работать с другими инструментами, быть простым в использовании, обучении и т.д
C++11 не слишком далеко ушел от C++ 03, но он действительно привнес много нового функционала.
Что нового в С++11?
Вот список основного функционала, который добавили в C++11 (это не полный список всего, что добавили, а основная его часть, представляющая интерес):
auto;
char16_t, char_32t и новые литералы для их поддержки;
constexpr;
decltype;
спецификатор default;
делегирующие конструкторы;
ключевое слово delete;
классы enum;
внешние шаблоны;
лямбда-выражения;
long long int;
конструктор перемещения и оператор присваивания перемещением;
спецификатор noexcept;
nullptr;
модификаторы override и final;
цикл foreach;
ссылки r-value;
static_assert;
std::initializer_list;
псевдонимы типов;
uniform-инициализация;
пользовательские литералы;
вариативные шаблоны.
Примечание: К каждой теме (из списка нововведений, расположенного выше), которую мы рассматривали, указана ссылка на соответствующий урок. Если ссылка на урок не указана, значит мы не рассматривали эту тему. Впрочем, вы всегда сможете найти дополнительную информацию в Google.
В C++11 также было добавлено много новых классов, доступных к использованию, и улучшены старые:
- лучшая поддержка многопоточности и локальное хранилище потоков
- хеш-таблицы
- улучшенная генерация случайных чисел
- std::reference_wrapper
- регулярные выражения
- std::tuple
- std::unique_ptr