Стандарты C++: от C++98 до C++26
C++ — это один из самых популярных и мощных языков программирования, эволюционировавший через серию официальных стандартов ISO/IEC 14882. Каждый новый стандарт добавляет значимые улучшения: от базовой объектно-ориентированной модели до современных возможностей для параллелизма, метапрограммирования и производительности.
Информация в этой статье основана исключительно на данных с указанных источников: официального сайта isocpp.org, форума RSDN (хотя там в основном правила обсуждений), документации GCC и статуса Clang. История стандартов частично собрана из публикаций и FAQ на isocpp.org. Поддержка в компиляторах (GCC и Clang) взята напрямую из их официальных страниц. Для MSVC детальной информации в указанных источниках нет — рекомендуется проверять актуальный статус на сайте Microsoft.
Стандарты публикуются примерно каждые 3 года, начиная с 2011-го. Каждый последующий стандарт обратно совместим с предыдущими (с небольшими исключениями).
C++98 (ISO/IEC 14882:1998)
Описание: Первый официальный стандарт C++. Определил базовый синтаксис, шаблоны, исключения, STL (Standard Template Library) и модель памяти. Это фундамент современного C++.
Ключевые особенности и примеры использования:
- Шаблоны (template), контейнеры (std::vector, std::list).
- Исключения (try/catch).
- Используется до сих пор в legacy-коде, embedded-системах и там, где нужна максимальная совместимость.
Реализация в компиляторах:
- GCC: Полная поддержка (кроме ключевого слова export, которое никогда не было реализовано). Флаг: -std=c++98 или -std=c++03.
- Clang: Полная поддержка (кроме export). Флаг: -std=c++98. Полная с Clang 3.3.
- MSVC: Не описано в источниках.
C++03 (ISO/IEC 14882:2003)
Описание: Техническая корректировка C++98. Исправлены ошибки, уточнены формулировки. По сути — «C++98 с исправлениями». Не добавляет новых крупных фич.
Ключевые особенности и примеры использования:
- Уточнения поведения шаблонов и библиотек.
- Используется в старых проектах, где важна строгая совместимость с C++98.
Реализация в компиляторах:
- GCC: Включено в режим C++98 (большинство изменений C++03 реализовано).
- Clang: Полная (как часть C++98/C++03).
- MSVC: Не описано в источниках.
C++11 (ISO/IEC 14882:2011)
Описание: «Современный C++». Революционный стандарт, который кардинально изменил язык. Ratified в августе 2011 года (21-0 голосов).
Ключевые особенности и примеры использования:
- auto, лямбда-выражения, range-based for, nullptr, constexpr, rvalue-ссылки и move-семантика, variadic templates, initializer lists.
- Примеры: Лямбды используются в std::sort или алгоритмах STL для компактного кода; auto упрощает итераторы; move-семантика ускоряет работу с векторами больших объектов. Современный код почти всегда использует C++11+.
Реализация в компиляторах:
- GCC: Полная с GCC 4.8.1 (многие фичи уже в 4.3–4.7). Флаг: -std=c++11.
- Clang: Полная с Clang 3.3. Флаг: -std=c++11.
- MSVC: Не описано в источниках.
C++14 (ISO/IEC 14882:2014)
Описание: Небольшое улучшение C++11. Опубликовано в 2014 году. Фокус — удобство и небольшие доработки.
Ключевые особенности и примеры использования:
- Binary literals (0b1010), decltype(auto), generic lambdas, variable templates, relaxed constexpr.
- Примеры: Generic lambdas упрощают шаблонные колбэки; variable templates позволяют писать template<typename T> constexpr T pi = 3.14;.
Реализация в компиляторах:
- GCC: Полная с GCC 6.1 (фичи с 4.3–5). Флаг: -std=c++14.
- Clang: Полная с Clang 3.4. Флаг: -std=c++14.
- MSVC: Не описано в источниках.
C++17 (ISO/IEC 14882:2017)
Описание: Значительное обновление. Добавлены возможности для параллелизма и удобства.
Ключевые особенности и примеры использования:
- Structured bindings, if constexpr, inline variables, fold expressions, nested namespaces, std::string_view, parallel algorithms в STL.
- Примеры: auto [x, y] = std::pair{1, 2}; — удобное разложение кортежей; if constexpr для compile-time ветвления в шаблонах.
Реализация в компиляторах:
- GCC: Полная (стабильная ABI с GCC 9). Флаг: -std=c++17.
- Clang: Полная с Clang 5. Флаг: -std=c++17.
- MSVC: Не описано в источниках.
C++20 (ISO/IEC 14882:2020)
Описание: Крупный стандарт с модулями и концептами. Опубликован в 2020 году.
Ключевые особенности и примеры использования:
- Concepts, coroutines, modules, ranges, consteval, spaceship operator <=>, designated initializers.
- Примеры: Concepts позволяют писать template<typename T> concept Integral = …; для ограничения шаблонов; coroutines — co_await для асинхронного кода (например, в сетевых библиотеках).
Реализация в компиляторах:
- GCC: Mostly complete (по умолчанию с GCC 16; модули экспериментальны). Флаг: -std=c++20.
- Clang: Частичная (с Clang 9). Флаг: -std=c++20.
- MSVC: Не описано в источниках.
C++23 (ISO/IEC 14882:2024)
Описание: Эволюционный стандарт (опубликован в 2024 году). Фокус на удобстве и небольших улучшениях.
Ключевые особенности и примеры использования:
- if consteval, deducing this, extended floating-point types, std::stacktrace, std::print, std::mdspan.
- Примеры: std::print(«Hello {}!», name); — современный вывод вместо std::cout; deducing this упрощает CRTP-паттерны.
Реализация в компиляторах:
- GCC: Mostly complete (экспериментально с GCC 11). Флаг: -std=c++23.
- Clang: Частичная (с Clang 13). Флаг: -std=c++23.
- MSVC: Не описано в источниках.
C++26 (в разработке, ожидаемая публикация — 2026)
Описание: Будущий стандарт (рабочий черновик C++2c). Включает reflection, contracts и другие мощные фичи.
Ключевые особенности и примеры использования (экспериментальные):
- Reflection, contracts, #embed, constexpr improvements, trivial unions.
- Примеры: Reflection позволит писать код, который анализирует типы на этапе компиляции; contracts — встроенные pre/post-conditions.
Реализация в компиляторах:
- GCC: Экспериментальная (с GCC 14, флаг -std=c++2c). Некоторые фичи (reflection) с GCC 16.
- Clang: Частичная (с Clang 17, флаг -std=c++2c).
- MSVC: Не описано в источниках.
Заключение
C++ продолжает эволюционировать: от строгого C++98 к высокоуровневым возможностям C++23/C++26. Большинство современных проектов используют C++17 или C++20 как минимум. Для компиляции всегда указывайте -std=c++XX (или gnu++XX для расширений GCC).
Рекомендуется использовать GCC или Clang для максимальной совместимости со стандартами. Актуальный статус всегда можно проверить по ссылкам ниже.
Список источников и полезных ссылок
- https://isocpp.org/ — официальный сайт Standard C++ (новости, FAQ по C++11 и др.).
- https://rsdn.org/forum/info/info.forum.cpp — раздел форума RSDN по C/C++ (правила и обсуждения).
- https://gcc.gnu.org/onlinedocs/gcc/Standards.html — стандарты в GCC.
- https://clang.llvm.org/cxx_status.html — статус C++ в Clang.
- https://gcc.gnu.org/projects/cxx-status.html — детальный статус GCC (дополнительная страница).
- Дополнительно с isocpp.org: C++11 FAQ, C++14 announcement и рабочие drafts.
Актуальность: апрель 2026. Стандарты и поддержка компиляторов могут обновляться.