Стандарты C++: от C++98 до C++26

aside
Стандарты 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 для максимальной совместимости со стандартами. Актуальный статус всегда можно проверить по ссылкам ниже.

Список источников и полезных ссылок

  1. https://isocpp.org/ — официальный сайт Standard C++ (новости, FAQ по C++11 и др.).
  2. https://rsdn.org/forum/info/info.forum.cpp — раздел форума RSDN по C/C++ (правила и обсуждения).
  3. https://gcc.gnu.org/onlinedocs/gcc/Standards.html — стандарты в GCC.
  4. https://clang.llvm.org/cxx_status.html — статус C++ в Clang.
  5. https://gcc.gnu.org/projects/cxx-status.html — детальный статус GCC (дополнительная страница).
  6. Дополнительно с isocpp.org: C++11 FAQ, C++14 announcement и рабочие drafts.

Актуальность: апрель 2026. Стандарты и поддержка компиляторов могут обновляться.

Поделиться ссылкой: