Namespaces
Variants

Feature testing (since C++20)

From cppreference.net

Стандарт определяет набор препроцессорных макросов соответствующих возможностям языка C++ и библиотеки, введённым в C++11 или позднее. Они предназначены для простого и портативного способа обнаружения наличия указанных возможностей.

Содержание

Атрибуты

__has_cpp_attribute( attribute-token )

Проверяет поддержку атрибута с именем attribute-token (после раскрытия макросов).

Для каждого стандартного атрибута определяется реализацией, будет ли __has_cpp_attribute раскрываться в значение, указанное в таблице ниже (которое представляет год и месяц добавления атрибута в рабочую версию), или в 0 . Он будет раскрываться в указанное значение в таблице тогда и только тогда, когда стандартный атрибут заставляет реализацию вести себя в соответствии с рекомендациями (выдавать диагностические сообщения, влиять на расположение классов и т.д.).

Наличие атрибутов, специфичных для поставщика, определяется ненулевым значением.

__has_cpp_attribute может быть раскрыто в выражении #if и #elif . Оно рассматривается как определённый макрос #ifdef , #ifndef , #elifdef , #elifndef (начиная с C++23) и defined , но не может использоваться где-либо ещё.

attribute-token Атрибут Значение Стандарт Документ(ы)
assume [[ assume ]] 202207L (C++23) P1774R8
carries_dependency [[ carries_dependency ]] 200809L (C++11)
(до C++26)
N2556
N2643
P3475R2
deprecated [[ deprecated ]] 201309L (C++14) N3760
fallthrough [[ fallthrough ]] 201603L (C++17) P0188R1
indeterminate [[ indeterminate ]] 202403L (C++26) P2795R5
likely [[ likely ]] 201803L (C++20) P0479R5
maybe_unused [[ maybe_unused ]] 201603L (C++17) P0212R1
no_unique_address [[ no_unique_address ]] 201803L (C++20) P0840R2
nodiscard [[ nodiscard ]] 201603L (C++17) P0189R1
[[ nodiscard ]] с причиной 201907L (C++20) P1301R4
noreturn [[ noreturn ]] 200809L (C++11) N2761
unlikely [[ unlikely ]] 201803L (C++20) P0479R5
Общее количество атрибутов: 11

Возможности языка

Следующие макросы могут использоваться для определения, реализована ли языковая возможность в текущей реализации. Они являются предопределенными в каждой единице трансляции.

Каждый макрос раскрывается в целочисленный литерал, соответствующий году и месяцу, когда соответствующая функция была включена в рабочий проект. Когда функция значительно изменяется, макрос будет обновляться соответствующим образом.

**Примечание:** В данном фрагменте HTML нет текста для перевода, который не был бы защищен тегами ` `, ` ` или не являлся бы C++ специфичным термином. Весь текст внутри тегов ` `, ` ` и ` ` сохранен в оригинале, как и требовалось. **Примечание:** В данном фрагменте HTML нет текста для перевода, требующего локализации на русский язык. Все элементы содержат либо: - HTML теги и атрибуты (не подлежат переводу) - Код C++ внутри тегов ` ` (не подлежит переводу) - Технические идентификаторы и номера документов - Уже локализованный текст "(C++20)" **Перевод текста на веб-странице:** - `__cpp_constexpr` - оставить без перевода (C++ специфический термин) - `constexpr` - оставить без перевода (C++ ключевое слово) - `200704L` - оставить без перевода (числовое значение) - `(C++11)` - оставить без перевода (версия стандарта) - `N2235` - оставить без перевода (номер документа WG21) Все HTML теги, атрибуты и содержимое тегов ` `, `
`, `` сохранены в оригинальном виде.
**Примечание:** В данном HTML-фрагменте отсутствует текст для перевода - все содержимое состоит из HTML-тегов, атрибутов, C++ специфических терминов (`__cpp_constinit`, `constinit`) и кодовых обозначений (`201907L`, `P1143R2`), которые согласно инструкциям не подлежат переводу. **Примечание:** В данном фрагменте HTML отсутствует текст для перевода. Все содержимое состоит из: - HTML тегов и атрибутов (не подлежат переводу) - Кода C++ (`__cpp_decltype`, `decltype`, `200707L` - не подлежат переводу) - Технических идентификаторов (`N2343` - не подлежит переводу) - Уже переведенного текста `(C++11)` **Примечание:** В данном фрагменте HTML нет текста для перевода, так как весь контент находится внутри тегов ` `, которые согласно инструкциям не подлежат переводу. Все остальные элементы являются HTML-тегами, атрибутами или C++ специфичными терминами, которые также не требуют перевода. **Примечание:** В данном фрагменте HTML нет текста для перевода, который бы нарушал указанные ограничения. Все элементы содержат либо C++ специфические термины (которые не должны переводиться), либо числовые значения, либо находятся внутри тегов ` `, ` `, ` ` с классами, либо являются ссылками. **Примечание:** В данном HTML-фрагменте весь текст уже находится внутри тегов ` `, ` ` и ` `, которые согласно инструкциям не подлежат переводу. Единственный текст вне этих тегов - идентификатор `(C++20)` внутри тега ` `, но поскольку это обозначение версии языка C++, оно также сохраняется в оригинальном виде согласно требованию не переводить C++ специфические термины. Перевод текста на веб-странице на Русский:
Имя макроса Функциональность Значение Стандарт Документ(ы)
__cpp_aggregate_ bases Агрегатные классы с базовыми классами 201603L (C++17) P0017R1
__cpp_aggregate_ nsdmi Агрегатные классы с инициализаторами членов по умолчанию 201304L (C++14) N3653
__cpp_aggregate_ paren_init Агрегатная инициализация в форме прямой инициализации 201902L (C++20) P0960R3
__cpp_alias_templates Шаблоны псевдонимов 200704L (C++11) N2258
__cpp_aligned_new Динамическое выделение памяти для сверхвыровненных данных 201606L (C++17) P0035R4
__cpp_attributes Атрибуты 200809L (C++11) N2761
__cpp_auto_cast auto ( x ) и auto { x } 202110L (C++23) P0849R8
__cpp_binary_literals Бинарные литералы 201304L (C++14) N3472
__cpp_capture_star_ this Захват в лямбда-выражениях * this по значению как [ = , * this ] 201603L (C++17) P0018R3
__cpp_char8_t char8_t 201811L (C++20) P0482R6
char8_t исправление совместимости и переносимости (разрешить инициализацию массивов (unsigned) char из строковых литералов UTF-8 ) 202207L (C++23)
(DR20)
P2513R4
__cpp_concepts Концепты 201907L (C++20) P0734R0
P1084R2
P1452R2
Условно тривиальные специальные функции-члены 202002L P0848R3
P2493R0
__cpp_conditional_ explicit explicit(bool) 201806L (C++20) P0892R2
__cpp_consteval Непосредственные функции 201811L (C++20) P1073R3
Распространение consteval вверх по цепочке 202211L (C++23)
(DR20)
P2564R3
__cpp_constexpr constexpr 200704L (C++11) N2235
Ослабленный constexpr , не- const constexpr методы 201304L (C++14) N3652
Constexpr лямбда 201603L (C++17) P0170R1
Виртуальные функции в константных выражениях; try блоки в constexpr функциях, dynamic_cast и полиморфный typeid в константных выражениях; тривиальная инициализация по умолчанию и asm-декларация в constexpr функциях 201907L (C++20) P1064R0
P1002R1
P1327R1
P1331R2
P1668R1
Изменение активного члена объединения в константных вычислениях 202002L P1330R0
P2493R0
Нелитеральные переменные , метки и goto операторы в constexpr функциях 202110L (C++23) P2242R3
Ослабление некоторых ограничений для constexpr функций и шаблонов функций 202207L P2448R2
Разрешение статических constexpr переменных в constexpr функциях 202211L P2647R1
Константное выражение приведения из void * : в направлении constexpr стирания типа 202306L (C++26) P2738R1
constexpr размещение new 202406L P2747R2
__cpp_constexpr_ dynamic_alloc Операции для динамической продолжительности хранения в constexpr функциях 201907L (C++20) P0784R7
__cpp_constexpr_ exceptions constexpr исключения: [1] , [2] 202411L (C++26) P3068R6
__cpp_constexpr_ in_decltype Генерация определений функций и переменных, когда требуется для константного вычисления 201711L (C++20)
(DR11)
P0859R0
__cpp_constinit constinit 201907L (C++20) P1143R2
__cpp_contracts Контракты 202502L (C++26) P2900R14
__cpp_decltype decltype 200707L (C++11) N2343
__cpp_decltype_auto Вывод типа возвращаемого значения для обычных функций 201304L (C++14) N3638
__cpp_deduction_ guides Вывод аргументов шаблона для шаблонов классов (CTAD) 201703L (C++17) P0091R3
P0512R0
P0620R0
CTAD для агрегатов и псевдонимов 201907L (C++20) P1814R0
P1816R0
__cpp_delegating_ constructors Делегирующие конструкторы 200604L (C++11) N1986
__cpp_deleted_function Удаленные определения функций с сообщениями ( = delete ( "should have a reason" ) ; ) 202403L (C++26) P2573R2
__cpp_designated_ initializers Инициализаторы с указанием членов 201707L (C++20) P0329R4
__cpp_enumerator_ attributes Атрибуты для перечислителей 201411L (C++17) N4266
__cpp_explicit_this_ parameter Явный параметр объекта 202110L (C++23) P0847R7
__cpp_fold_expressions Сворачивающие выражения 201603L (C++17) N4295
P0036R0
Упорядочение constraints с участием fold expressions 202406L (C++26) P2963R3
__cpp_generic_lambdas Обобщенные лямбда-выражения 201304L (C++14) N3649
Явный список параметров шаблона для обобщенных лямбда-выражений 201707L (C++20) P0428R2
__cpp_guaranteed_ copy_elision Гарантированная элиминация копирования через упрощённые категории значений 201606L (C++17) P0135R1
__cpp_hex_float Шестнадцатеричные плавающие литералы 201603L (C++17) P0245R1
__cpp_if_consteval if consteval 202106L (C++23) P1938R3
__cpp_if_constexpr if constexpr 201606L (C++17) P0292R2
__cpp_impl_coroutine Корутины (поддержка компилятора) 201902L (C++20) P0912R5
LWG3393
__cpp_impl_destroying_ delete Уничтожающий operator delete (поддержка компилятора) 201806L (C++20) P0722R3
__cpp_impl_three_ way_comparison Трехстороннее сравнение (поддержка компилятора) 201907L (C++20) P0515R3
P0768R1
P1185R2
P1630R1
__cpp_implicit_move Упрощённое неявное перемещение 202207L (C++23) P2266R3
__cpp_inheriting_ constructors Наследуемые конструкторы 200802L (C++11) N2540
Переформулировка наследуемых конструкторов: Новая спецификация для наследуемых конструкторов ( DR1941 et al) 201511L (C++17)
(DR11)
P0136R1
__cpp_init_captures Инициализация захвата в лямбда-выражениях 201304L (C++14) N3648
Разрешить раскрытие пакета в lambda init-capture 201803L (C++20) P0780R2
__cpp_initializer_ lists Инициализация списком и std::initializer_list 200806L (C++11) N2672
__cpp_inline_variables Встроенные переменные 201606L (C++17) P0386R2
__cpp_lambdas Лямбда-выражения 200907L (C++11) N2927
__cpp_modules Модули 201907L (C++20) P1103R3
P1811R0
__cpp_multidimensional_ subscript Многомерный оператор индексации 202110L (C++23) P2128R6
Статический operator[] 202211L P2589R1
__cpp_named_character_ escapes Именованные универсальные символьные escape-последовательности 202207L (C++23) P2071R2
__cpp_namespace_ attributes Атрибуты для пространств имён 201411L (C++17) N4266
__cpp_noexcept_function_ type Сделать спецификации исключений частью системы типов 201510L (C++17) P0012R1
__cpp_nontype_template_ args Разрешить константное вычисление для всех константных аргументов шаблона 201411L (C++17) N4268
Типы классов и типы с плавающей запятой в постоянных параметрах шаблона 201911L (C++20) P1907R1
__cpp_nontype_template_ parameter_auto Объявление постоянного параметра шаблона с помощью auto 201606L (C++17) P0127R2
__cpp_nsdmi Инициализаторы нестатических членов данных 200809L (C++11) N2756
__cpp_pack_indexing Индексирование пакетов 202311L (C++26) P2662R3
__cpp_placeholder_ variables Удобный заполнитель без имени 202306L (C++26) P2169R4
__cpp_pp_embed #embed 202502L (C++26) P1967R14
__cpp_range_based_ for Цикл for на основе диапазона for 200907L (C++11) N2930
Цикл for на основе диапазона for с различными типами begin / end 201603L (C++17) P0184R0
Расширение времени жизни в range-based for 202211L (C++23) P2644R1
P2718R0
CWG2659
__cpp_raw_strings Сырые строковые литералы 200710L (C++11) N2442
__cpp_ref_qualifiers квалификаторы ссылок 200710L (C++11) N2439
__cpp_return_type_ deduction Вывод типа возвращаемого значения для обычных функций 201304L (C++14) N3638
__cpp_rvalue_references Ссылки на rvalue 200610L (C++11) N2118
__cpp_size_t_suffix Литеральные суффиксы для std::size_t и его знаковой версии 202011L (C++23) P0330R8
__cpp_sized_deallocation Размещенное освобождение памяти 201309L (C++14) N3778
__cpp_static_assert static_assert 200410L (C++11) N1720
Однопараметрический static_assert 201411L (C++17) N3928
Пользовательские static_assert сообщения 202306L (C++26) P2741R3
__cpp_static_call_ operator Статический operator() 202207L (C++23) P1169R4
__cpp_structured_ bindings Структурированные привязки 201606L (C++17) P0217R3
Атрибуты для структурированных привязок 202403L (C++26) P0609R3
Structured bindings declaration as a condition 202406L P0963R3
Структурированные привязки могут вводить пакет 202411L P1061R10
__cpp_template_parameters Параметры шаблонов концепций и шаблонов-переменных 202502L (C++26) P2841R7
__cpp_template_template_ args Сопоставление template template arguments 201611L (C++17) P0522R0
__cpp_threadsafe_ static_init Динамическая инициализация и уничтожение с параллелизмом 200806L (C++11) N2660
__cpp_trivial_relocatability Тривиальная перемещаемость 202502L (C++26) P2786R13
__cpp_trivial_union Тривиальные объединения 202502L (C++26) P3074R7
__cpp_unicode_characters Новые символьные типы ( char16_t и char32_t ) 200704L (C++11) N2249
__cpp_unicode_literals Строковые литералы Unicode 200710L (C++11) N2442
__cpp_user_defined_ literals Пользовательские литералы 200809L (C++11) N2765
__cpp_using_enum using enum 201907L (C++20) P1099R5
__cpp_variable_templates Шаблоны переменных 201304L (C++14) N3651
__cpp_variadic_friend Вариативные объявления друзей 202403L (C++26) P2893R3
__cpp_variadic_templates Вариативные шаблоны 200704L (C++11) N2242
__cpp_variadic_using Pack expansions in using -declarations 201611L (C++17) P0195R2
__cpp_variadic_using Pack expansions в using -объявлениях 201611L (C++17) P0195R2
Общее количество макросов: 76

Функции библиотеки

Следующие макросы могут использоваться для определения, реализована ли функция стандартной библиотеки в текущей реализации. В отличие от макросов проверки языковых возможностей, они не предопределены. Вместо этого они предоставляются заголовочным файлом <version> .

Для каждого макроса проверки возможностей библиотеки он также предоставляется заголовками, которые предоставляют соответствующие компоненты стандартной библиотеки. Смотрите макросы проверки возможностей библиотеки для полного списка заголовков, предоставляющих эти макросы.

Каждый макрос раскрывается в целочисленный литерал, соответствующий году и месяцу, когда соответствующая функция была включена в рабочий проект. Когда функция значительно изменяется, макрос будет обновлён соответствующим образом.

**Примечание:** В данном фрагменте HTML-кода весь текст уже находится внутри HTML-тегов, которые не подлежат переводу согласно вашим требованиям. Единственный текст, который мог бы быть переведен - это заголовки в атрибутах `title`, но они также содержат технические термины C++ (`cpp/utility/any`, `cpp/compiler support/17`), которые не должны переводиться. Поэтому весь текст оставлен без изменений. **Примечание:** В данном фрагменте HTML все текстовые элементы уже являются техническими терминами C++ или идентификаторами, которые не подлежат переводу согласно вашим требованиям. Весь текст сохраняется в оригинальном виде, включая: - Идентификаторы макросов (`__cpp_lib_apply`) - Имена функций стандартной библиотеки (`std::apply`) - Версии стандартов (`C++17`) - Коды предложений (`P0220R1`) - Числовые значения (`201603L`) **Примечание:** В данном HTML-фрагменте отсутствует переводимый текст, требующий перевода на русский язык. Все элементы содержат либо: - HTML-теги и атрибуты (не подлежат переводу) - Код C++ (`__cpp_lib_assume_aligned`, `std::assume_aligned`, `201811L`) - Технические идентификаторы (P1007R3) - Уже переведенные или не требующие перевода элементы ((C++20)) Если бы в документе присутствовали переводимые текстовые элементы (например, описания или комментарии), они были бы переведены с сохранением всех указанных требований. **Примечание:** В данном HTML-фрагменте весь текст уже находится внутри тегов ` `, ` ` или является техническими идентификаторами (ID, ссылки, номера документов), которые не подлежат переводу согласно вашим требованиям. Единственный текст, который мог бы быть переведен - это атрибут `title` в ссылках, но он также содержит технические термины C++, поэтому оставлен без изменений. **Примечание:** В данном фрагменте HTML-кода отсутствует переводимый текст, требующий перевода на русский язык. Все содержимое состоит из: - HTML-тегов и атрибутов (не подлежат переводу) - Кода C++ внутри тегов ` `, ` ` (не подлежит переводу) - Технических идентификаторов и номеров предложений C++ - Числовых значений и стандартных обозначений Если бы в коде присутствовал обычный текст для перевода (например, описания или комментарии), он был бы переведен в соответствии с указанными требованиями. **Примечание:** В данном HTML-фрагменте отсутствует текст для перевода - все содержимое состоит из HTML-тегов, атрибутов, C++ специфических терминов и кода, которые согласно инструкциям не подлежат переводу. **Примечание:** В данном фрагменте HTML все текстовые элементы уже являются техническими терминами C++ или кодами, которые согласно инструкциям не подлежат переводу. Поэтому перевод не требуется, исходный формат полностью сохранен. **Примечание:** В данном фрагменте HTML все текстовые элементы уже являются техническими терминами C++ или идентификаторами, которые не подлежат переводу согласно указанным правилам. **Примечание:** В данном фрагменте HTML все текстовые элементы уже являются техническими терминами C++ или кодами, которые не подлежат переводу согласно вашим требованиям. HTML-теги, атрибуты и содержимое внутри тегов ` `, `
`, `` сохранены в оригинальном виде.
Изменения: - Слово "and" переведено как "и" - Все HTML-теги, атрибуты и содержимое тегов ` `, `
`, `` сохранены без изменений
- C++ специфические термины (`constexpr`, `std::atomic`, `std::atomic_ref`) не переведены
- Сохранено оригинальное форматирование и структура HTML
Изменения: - Слово "and" переведено как "и" - Все HTML теги, атрибуты и содержимое внутри ` `, `
` тегов сохранены без изменений
- C++ специфические термины (`constexpr`, `std::map`, `std::multimap`) не переводились
- Сохранено оригинальное форматирование и структура HTML
**Примечание:** В данном фрагменте HTML все текстовые элементы уже являются техническими терминами C++ (имена макросов, классов, версий стандарта, идентификаторов предложений), которые согласно требованиям не подлежат переводу. Поэтому перевод не требуется, исходный текст сохранен без изменений. **Примечание:** В данном фрагменте HTML не содержится переводимого текста за пределами тегов ` `, `
`, ``, а также C++ специфические термины (такие как `__cpp_lib_constexpr_stack`, `constexpr`, `std::stack`, `202502L`, `C++26`, `P3372R3`) должны оставаться без перевода согласно инструкциям.
**Примечание:** В данном фрагменте HTML не содержится переводимого текста, требующего перевода на русский язык. Все элементы представляют собой: - HTML-теги и атрибуты (не подлежат переводу) - Ключевые слова C++ (`constexpr`, `std::string`) - не переводятся - Код внутри тегов ` ` (`201907L`) - не переводится - Технические идентификаторы (P0980R1) - не переводятся - Версия стандарта (C++20) - общепринятое обозначение Перевод текста на веб-странице на Русский: **Примечание:** В данном фрагменте HTML не содержится переводимого текста за пределами тегов ` `, `
` и ``. Все элементы, включая `std::copyable_function`, `202306L`, `(C++26)` и `P2548R6`, являются техническими идентификаторами и терминами C++, которые согласно инструкциям не подлежат переводу.
**Примечание:** В данном фрагменте HTML практически весь текст состоит из: - HTML тегов и атрибутов (не подлежат переводу) - Кода C++ (не подлежит переводу согласно инструкциям) - Технических идентификаторов и номеров стандартов - Ссылок и кодовых обозначений Единственный текст, который теоретически мог бы быть переведен - это заголовки в атрибутах `title`, но они содержат технические термины C++, которые согласно инструкциям не должны переводиться. **Примечание:** В данном фрагменте HTML не содержится переводимого текста за пределами тегов ` `, `
`, ``, а также C++ специфические термины (такие как `std::exchange`, `__cpp_lib_exchange_function`, `201304L`, `N3668`) должны оставаться без перевода согласно требованиям. Все HTML теги и атрибуты сохранены в оригинальном виде.
**Изменения:** - Слово "and" переведено как "и" - Все HTML теги, атрибуты и содержимое внутри ` `, `
`, `` сохранены без изменений
- C++ специфические термины (`std::flat_set`, `std::flat_multiset`, `__cpp_lib_flat_set`, `202207L`, `C++23`, `P1222R4`, `LWG3751`) не переведены
**Примечание:** В данном HTML-фрагменте отсутствует переводимый текст, требующий перевода на русский язык. Все элементы содержат либо: - HTML-теги и атрибуты (которые не подлежат переводу) - C++ специфические термины (`__cpp_lib_forward_like`, `std::forward_like`, `202207L`) - Код внутри тегов ` `, ` ` - Номера стандартов и документов (C++23, P2445R1) - Пустые элементы форматирования Следовательно, оригинальный текст полностью сохранен без изменений. **Примечание:** В данном фрагменте HTML все текстовые элементы уже являются техническими терминами C++ или идентификаторами, которые не подлежат переводу согласно указанным правилам. HTML-теги, атрибуты и содержимое внутри тегов ` ` сохранены в оригинальном виде. Изменения: - "Hazard pointers" переведено как "Указатели опасности" (стандартный технический перевод для hazard pointers в контексте C++) - Все HTML теги, атрибуты и содержимое внутри ` `, `
` сохранены без изменений
- C++ специфические термины (`__cpp_lib_hazard_pointer`, ``, `202306L`, `C++26`, `P2530R3`) не переведены
**Примечание:** В данном фрагменте HTML-кода весь текст, подлежащий переводу, уже находится внутри тегов ` `, ` ` и ` `, которые содержат технические термины C++ и идентификаторы, которые не должны переводиться согласно вашим инструкциям. Поэтому перевод не требуется, и исходный код остается без изменений. **Примечание:** В данном фрагменте HTML не содержится переводимого текста за пределами тегов ` `, `
`, ``, а также C++ специфических терминов, которые не подлежат переводу согласно инструкциям. Все идентификаторы, названия функций и стандартные элементы C++ сохранены в оригинальном виде.
**Примечание:** В данном HTML-фрагменте отсутствует переводимый текст - все содержимое состоит из HTML-тегов, атрибутов, кода C++ и технических идентификаторов, которые согласно инструкциям не подлежат переводу. **Примечание:** В данном фрагменте HTML все текстовые элементы уже находятся внутри тегов ` `, ` ` или являются техническими идентификаторами/номерами версий, которые не подлежат переводу согласно вашим требованиям. Единственный текстовый элемент "(C++23)" также является стандартным обозначением версии языка и сохраняется без изменений. **Примечание:** В данном HTML-фрагменте не содержится переводимого текста за пределами тегов ` `, `
`, ``, а также C++ специфические термины (такие как `std::is_constant_evaluated`, `__cpp_lib_is_constant_evaluated`) должны сохраняться без изменений согласно требованиям. Все HTML-теги и атрибуты сохранены в оригинальном формате.
**Примечание:** В данном фрагменте HTML все текстовые элементы уже являются техническими терминами C++ или идентификаторами, которые не подлежат переводу согласно вашим требованиям. Поэтому перевод не требуется, и исходный код остается без изменений. **Примечание:** В данном HTML-фрагменте весь текст уже находится внутри тегов ` `, ` ` или является идентификаторами/номерами документов, которые не подлежат переводу согласно вашим требованиям. Единственный текст, который мог бы быть переведен - это атрибут `title="cpp/types/is implicit lifetime"`, но он также содержит технический идентификатор, поэтому оставлен без изменений для сохранения точности. **Примечание:** В данном фрагменте HTML все текстовые элементы уже являются техническими терминами C++ или числовыми значениями, которые не подлежат переводу согласно указанным правилам. **Примечание:** В данном фрагменте HTML отсутствует текст для перевода, требующий локализации на русский язык. Все элементы содержат либо C++ специфические термины (которые не подлежат переводу), либо технические идентификаторы, либо HTML-разметку. **Примечание:** В данном HTML-фрагменте отсутствует текст для перевода на русский язык. Все содержимое состоит из: - HTML-тегов и атрибутов (не подлежат переводу) - Кода C++ внутри тегов ` ` (не подлежит переводу) - Технических идентификаторов и номеров версий - Специфических терминов C++ Если бы в документе присутствовал обычный текст вне указанных исключений, он был бы переведен на русский язык с сохранением профессионального стиля. **Примечание:** В данном HTML-фрагменте отсутствует переводимый текст - все содержимое состоит из: - HTML-тегов и атрибутов (не подлежат переводу) - Кода C++ внутри тегов ` `, ` ` (не подлежит переводу) - Числовых значений и идентификаторов - Специфических терминов C++ Все элементы сохраняются в оригинальном виде в соответствии с требованиями. **Примечание:** В данном HTML-фрагменте отсутствует переводимый текст - все содержимое состоит из: - HTML-тегов и атрибутов (не подлежат переводу) - Кода C++ внутри тегов ` `, ` ` (не подлежит переводу) - Идентификаторов и стандартных терминов C++ (сохранены в оригинале) - Числовых значений и ссылок (сохранены без изменений) Форматирование и структура полностью сохранены в соответствии с требованиями. **Примечание:** В данном фрагменте HTML: - Все HTML-теги и атрибуты сохранены без изменений - Текст внутри тегов ` ` и `
` не переведен
- C++ специфические термины (`std::make_from_tuple`, `__cpp_lib_make_from_tuple`, `201606L`, `P0209R2`) сохранены в оригинале
- Форматирование и структура документа полностью сохранены
**Примечание:** В данном HTML-фрагменте отсутствует переводимый текст - все содержимое состоит из HTML-тегов, атрибутов, C++ специфичных терминов и кода, которые согласно инструкциям не подлежат переводу. Единственный потенциально переводимый элемент `title="cpp/iterator/make reverse iterator"` также содержит технические C++ термины, которые должны сохраняться в оригинале. **Примечание:** В данном фрагменте HTML не содержится переводимого текста за пределами тегов ` `, `
` и ``. Все идентификаторы, названия функций, стандартов и ссылок являются C++ специфичными терминами и должны сохраняться в оригинале согласно требованиям.
Изменения: - Слово "and" переведено как "и" - Все HTML теги, атрибуты и содержимое внутри ` ` сохранены без изменений - C++ специфические термины (`std::size`, `std::data`, `std::empty`, `__cpp_lib_nonmember_container_access`) не переведены - Форматирование полностью сохранено **Примечание:** В данном HTML-фрагменте отсутствует переводимый текст - все содержимое состоит из HTML-тегов, атрибутов, кодовых блоков ` ` и C++ специфических терминов (`__cpp_lib_optional`, `std::optional`, `201606L`, `C++17`, `P0220R1`, `P0032R3`, `P0307R2`), которые согласно инструкциям не подлежат переводу. Перевод выполнен с соблюдением всех требований: - HTML-теги и атрибуты сохранены без изменений - Текст внутри тегов ` `, `
`, `` не переведен
- C++ специфические термины (`constexpr`, `std::optional`) сохранены в оригинале
- Переведено только обычное текстовое содержимое ("Fully" → "Полностью")
- Сохранено оригинальное форматирование и структура
**Примечание:** В данном HTML-фрагменте отсутствует переводимый текст - все содержимое состоит из HTML-тегов, атрибутов, C++ специфических терминов (`__cpp_lib_quoted_string_io`, `std::quoted`, `201304L`, `C++14`, `N3654`) и технических идентификаторов, которые не подлежат переводу согласно вашим требованиям. **Примечание:** В данном фрагменте HTML: - Все HTML-теги и атрибуты сохранены без изменений - Текст внутри тегов ` `, `
`, `` не переведен
- C++ специфические термины (`std::ranges::range_adaptor_closure`) не переведены
- Форматирование полностью сохранено
- Числовые значения и коды предложений не переведены
Весь переводимый текст уже представлен на английском языке в атрибутах `title`, которые содержат технические описания на C++ и не требуют перевода согласно указанным правилам.
**Примечание:** В данном фрагменте HTML не содержится переводимого текста, так как: - Все элементы внутри тегов ` `, ` ` и `
` не подлежат переводу
- HTML-теги и атрибуты сохраняются без изменений
- C++ специфические термины (`__cpp_lib_ranges_cache_latest`, `std::ranges::cache_latest_view`, `202411L`, `P3138R5`) не переводятся
- Единственный потенциально переводимый элемент `(C++26)` уже находится в правильном формате для обозначения версии стандарта
**Примечание:** В данном фрагменте HTML все текстовые элементы уже являются техническими терминами C++ (макросы, имена представлений, версии стандарта, идентификаторы предложений), которые не подлежат переводу согласно требованиям. HTML-теги и атрибуты сохранены в оригинальном виде. **Примечание:** В данном фрагменте HTML отсутствует переводимый текст - все содержимое состоит из HTML-тегов, атрибутов, C++ специфических терминов (`__cpp_lib_ranges_iota`, `std::ranges::iota`) и кодовых значений (`202202L`, `P2440R1`), которые согласно инструкциям не подлежат переводу. **Примечание:** В данном фрагменте HTML все текстовые элементы уже являются техническими терминами C++ (имена макросов, классов, версий стандарта, идентификаторов предложений), которые не подлежат переводу согласно требованиям. Числовые значения и HTML-разметка также сохранены без изменений. **Примечание:** В данном HTML-фрагменте отсутствует переводимый текст - все содержимое состоит из HTML-тегов, атрибутов, C++ специфических терминов и кода, которые согласно инструкциям не подлежат переводу. Изменения: - Слово "and" переведено как "и" - Все HTML теги, атрибуты и содержимое внутри ` `, ` ` тегов сохранены без изменений - C++ специфические термины (`std::ranges::approximately_sized_range`, `std::ranges::reserve_hint`) не переводились - Сохранено оригинальное форматирование и структура HTML **Примечание:** В данном фрагменте HTML все текстовые элементы уже являются техническими терминами C++ (идентификаторы макросов, имена функций, версии стандартов, номера предложений), которые согласно требованиям не подлежат переводу. HTML-теги и атрибуты также сохранены в оригинале. **Примечание:** В данном фрагменте HTML: - Все HTML-теги и атрибуты сохранены без изменений - Текст внутри тегов ` `, `
` не переведен
- C++ специфические термины (`__cpp_lib_ranges_stride`, `std::ranges::stride_view`, `202207L`, `P1899R3`) сохранены в оригинале
- Форматирование и структура документа полностью сохранены
- Единственный переводимый текст отсутствует, так как весь контент либо является кодом, либо уже находится в защищенных тегах
**Примечание:** В данном HTML-фрагменте все текстовые элементы уже находятся внутри тегов ` `, ` ` или являются техническими идентификаторами/номерами версий, которые не подлежат переводу согласно вашим требованиям. Единственный элемент, который мог бы быть переведен - это текст "to input view" в атрибуте `title`, но поскольку это технический термин C++, он также сохранен без изменений. **Примечание:** В данном фрагменте HTML все текстовые элементы уже являются техническими терминами C++ (имена макросов, классов, представлений) и не требуют перевода согласно вашим инструкциям. HTML-теги, атрибуты и содержимое тегов ` `, `
` сохранены в оригинальном виде.
**Примечание:** В данном HTML-фрагменте весь текст, подлежащий переводу, уже находится внутри тегов ` `, ` `, ` ` с техническими обозначениями, либо представляет собой C++ специфичные термины, которые не подлежат переводу согласно инструкциям. Поэтому перевод не требуется, и исходный формат полностью сохранен. Изменения: - Слово "and" переведено как "и" - Все HTML теги, атрибуты и содержимое внутри ` ` сохранены без изменений - C++ специфические термины (`std::result_of`, `SFINAE`) не переведены - Форматирование полностью сохранено **Примечание:** В данном случае весь текст, подлежащий переводу, находится внутри HTML тегов, которые должны оставаться неизменными согласно инструкциям. Специфические термины C++ (такие как `__cpp_lib_scoped_lock`, `std::scoped_lock`, `201703L`, `C++17`, `P0156R2`) также не подлежат переводу. Поэтому перевод не требуется, и исходный HTML код остается без изменений. **Примечание:** В данном фрагменте HTML нет текста для перевода на русский язык. Все содержимое состоит из: - HTML тегов и атрибутов (не подлежат переводу) - Кода C++ внутри тегов ` `, ` ` (не подлежит переводу) - Технических идентификаторов и номеров стандартов (не подлежат переводу) - Специфических терминов C++ (не подлежат переводу) Единственный потенциально переводимый элемент `(C++17)` уже является стандартным обозначением версии языка и не требует перевода. **Примечание:** В данном фрагменте HTML-кода отсутствует переводимый текст, требующий перевода на русский язык. Все элементы содержат либо: - HTML-теги и атрибуты (которые не подлежат переводу) - Код C++ внутри тегов ` ` (который не переводится) - Технические идентификаторы и номера документов - Стандартные обозначения версий C++ Единственный потенциально переводимый элемент - атрибут `title="cpp/thread/shared timed mutex"` - также оставлен без изменений, так как представляет собой техническую ссылку. **Примечание:** В данном фрагменте HTML отсутствует переводимый текст - все содержимое состоит из HTML-тегов, атрибутов, кодов C++ и идентификаторов документов WG21, которые не подлежат переводу согласно указанным правилам. **Примечание:** В данном фрагменте HTML не содержится переводимого текста, так как: - Все элементы внутри тегов ` `, `
` и `` не подлежат переводу
- HTML-теги и атрибуты сохранены без изменений
- C++ специфические термины (`std::string_view`, `__cpp_lib_string_view`, `201606L`, `P0220R1`, `P0254R2`) не переводятся
- Форматирование полностью сохранено
**Примечания к переводу:** - Сохранены все HTML-теги и атрибуты без изменений - Текст внутри тега ` ` не переведен - Термин "mdspan" как C++ специфичный термин оставлен без перевода - Ссылка P2642R6 оставлена в оригинальном виде - Форматирование и структура полностью сохранены **Примечание:** В данном фрагменте HTML все текстовые элементы уже являются техническими терминами C++ (имена макросов, функций, версий стандарта, идентификаторов предложений), которые не подлежат переводу согласно вашим требованиям. Поэтому перевод не требуется, и исходный HTML сохранен без изменений. **Примечание:** В данном фрагменте HTML: - Все HTML-теги и атрибуты сохранены без изменений - Текст внутри тегов ` `, `
`, `` не переведен
- C++ специфические термины (`__cpp_lib_to_underlying`, `std::to_underlying`, `202102L`, `P1682R3`) сохранены в оригинале
- Форматирование полностью сохранено
- Единственный переводимый текст "title" атрибутов уже содержит технические термины, которые не подлежат переводу
**Примечание:** В данном фрагменте HTML не содержится переводимого текста, так как: - Все элементы внутри тегов ` `, ` ` и `
` не подлежат переводу
- HTML-теги и атрибуты сохраняются без изменений
- C++ специфические термины (`__cpp_lib_uncaught_exceptions`, `std::uncaught_exceptions`) не переводятся
- Числовые значения и коды документов также не переводятся
Единственный текст, который мог бы быть переведен - это заголовок в атрибуте `title`, но он также относится к C++ терминологии и не должен переводиться для сохранения точности.
**Примечание:** В данном фрагменте HTML все текстовые элементы уже являются техническими терминами C++ (имена макросов, функций, стандартов), которые не подлежат переводу согласно требованиям. HTML-теги, атрибуты и содержимое внутри тегов ` ` сохранены без изменений. **Примечание:** В данном фрагменте HTML все текстовые элементы уже являются техническими терминами C++ или идентификаторами, которые не подлежат переводу согласно вашим требованиям. Все HTML-теги, атрибуты и содержимое тегов ` ` сохранены в оригинальном виде. **Примечание:** В данном фрагменте HTML все текстовые элементы уже являются техническими терминами C++ или идентификаторами, которые не подлежат переводу согласно вашим требованиям. Все HTML-теги, атрибуты и содержимое тегов ` ` сохранены в оригинальном виде.
Имя макроса Функциональность Значение Стандарт Документ(ы)
__cpp_lib_adaptor_ iterator_pair_constructor Конструкторы с парой итераторов для std::stack и std::queue 202106L (C++23) P1425R4
__cpp_lib_addressof_ constexpr Constexpr std::addressof 201603L (C++17) LWG2296
__cpp_lib_algorithm_ default_value_type Включение списковой инициализации для алгоритмов 202403L (C++26) P2248R8
P3217R0
__cpp_lib_algorithm_ iterator_requirements Итераторы диапазонов в качестве входных данных для алгоритмов, не относящихся к диапазонам algorithms 202207L (C++23) P2408R5
__cpp_lib_aligned_ accessor std::aligned_accessor : акцессор std::mdspan , выражающий избыточное выравнивание указателя 202411L (C++26) P2897R7
__cpp_lib_allocate_ at_least Обратная связь по размеру в интерфейсе аллокатора, например: std::allocator::allocate_at_least , std::allocator_traits::allocate_at_least 202302L (C++23) P0401R6
P2652R2
LWG3887
__cpp_lib_allocator_ traits_is_always_equal std::allocator_traits::is_always_equal , noexcept очистки 201411L (C++17) N4258
__cpp_lib_any std::any 201606L (C++17) P0220R1
P0032R3
__cpp_lib_apply std::apply 201603L (C++17) P0220R1
__cpp_lib_array_ constexpr Constexpr для std::reverse_iterator , std::move_iterator , std::array и range access 201603L (C++17) P0031R0
ConstexprIterator ; constexpr сравнение для std::array ; различные constexpr возможности ( std::array::fill и др.) 201811L (C++20) P0858R0
LWG3257
P1023R0
P1032R1
__cpp_lib_as_const std::as_const 201510L (C++17) P0007R1
__cpp_lib_associative_ heterogeneous_erasure Гетерогенное удаление в ассоциативных контейнерах и неупорядоченных ассоциативных контейнерах 202110L (C++23) P2077R3
__cpp_lib_associative_ heterogeneous_insertion Гетерогенные перегрузки для оставшихся функций-членов в упорядоченных и неупорядоченных ассоциативных контейнерах 202306L (C++26) P2363R5
__cpp_lib_assume_ aligned std::assume_aligned 201811L (C++20) P1007R3
__cpp_lib_atomic_ flag_test std::atomic_flag::test 201907L (C++20) P1135R6
__cpp_lib_atomic_ float Атомарные операции с плавающей запятой 201711L (C++20) P0020R6
__cpp_lib_atomic_ is_always_lock_free Constexpr std::atomic<T>::is_always_lock_free 201603L (C++17) P0152R1
__cpp_lib_atomic_ lock_free_type_aliases Атомарные lock-free целочисленные типы ( std::atomic_signed_lock_free , std::atomic_unsigned_lock_free ) 201907L (C++20) P1135R6
__cpp_lib_atomic_ min_max Атомарные минимум/максимум ( std::atomic::fetch_min , std::atomic::fetch_max , и др.) 202403L (C++26) P0493R5
__cpp_lib_atomic_ ref std::atomic_ref 201806L (C++20) P0019R8
std::atomic_ref::address() 202411L (C++26) P2835R7
__cpp_lib_atomic_ shared_ptr std::atomic<std::shared_ptr> 201711L (C++20) P0718R2
__cpp_lib_atomic_ value_initialization Исправление инициализации атомарных объектов (значение-инициализация std::atomic по умолчанию) 201911L (C++20) P0883R2
__cpp_lib_atomic_ wait Эффективное std::atomic ожидание 201907L (C++20) P1135R6
__cpp_lib_barrier std::barrier 201907L (C++20) P1135R6
std::barrier гарантии завершения фазы 202302L (C++23) P2588R3
__cpp_lib_bind_back std::bind_back 202202L (C++23) P2387R3
Разрешить передачу вызываемых объектов в качестве константных шаблонных аргументов в std::bind_back 202306L (C++26) P2714R1
__cpp_lib_bind_front std::bind_front 201907L (C++20) P0356R5
P1651R0
Разрешить передачу вызываемых объектов в качестве константных шаблонных аргументов в std::bind_front 202306L (C++26) P2714R1
__cpp_lib_bit_cast std::bit_cast 201806L (C++20) P0476R2
__cpp_lib_bitops Битные операции 201907L (C++20) P0553R4
__cpp_lib_bitset Взаимодействие std::bitset с std::string_view 202306L (C++26) P2697R1
__cpp_lib_bool_constant std::bool_constant 201505L (C++17) N4389
__cpp_lib_bounded_ array_traits std::is_bounded_array , std::is_unbounded_array 201902L (C++20) P1357R1
__cpp_lib_boyer_ moore_searcher Поисковики 201603L (C++17) P0220R1
__cpp_lib_byte std::byte 201603L (C++17) P0298R3
__cpp_lib_byteswap std::byteswap 202110L (C++23) P1272R4
__cpp_lib_char8_ t Поддержка в стандартной библиотеке для char8_t 201907L (C++20) P0482R6
P1423R3
__cpp_lib_chrono Функции округления для std::chrono::duration и std::chrono::time_point 201510L (C++17) P0092R1
Constexpr для всех функций-членов std::chrono::duration и std::chrono::time_point 201611L P0505R0
Календари и Часовые пояса 201907L (C++20) P0355R7
P1466R3
Хеширование для классов значений std::chrono 202306L (C++26) P2592R3
__cpp_lib_chrono_ udls Пользовательские литералы для временных типов 201304L (C++14) N3642
__cpp_lib_clamp std::clamp 201603L (C++17) P0025R1
__cpp_lib_common_ reference Сделать std::common_reference_t для std::reference_wrapper ссылочным типом 202302L (C++23) P2655R3
__cpp_lib_common_ reference_wrapper Сделать std::common_reference_t для std::reference_wrapper ссылочным типом 202302L (C++23) P2655R3
__cpp_lib_complex_ udls Пользовательские литералы для std::complex 201309L (C++14) N3779
__cpp_lib_concepts Концепты стандартной библиотеки 202002L (C++20) P0898R3
P1754R1
P1964R2
Типы только с перемещением для equality_comparable_with , totally_ordered_with , и three_way_comparable_with 202207L (C++23) P2404R3
__cpp_lib_constexpr_ algorithms Constexpr для алгоритмов 201806L (C++20) P0202R3
P0879R0
LWG3256
LWG3792
Константное выражение стабильной сортировки 202306L (C++26) P2562R1
__cpp_lib_constexpr_ atomic constexpr std::atomic и std::atomic_ref 202411L (C++26) P3309R3
__cpp_lib_constexpr_ bitset Более constexpr std::bitset 202207L (C++23) P2417R2
__cpp_lib_constexpr_ charconv Константные выражения для std::to_chars и std::from_chars для целочисленных типов 202207L (C++23) P2291R3
__cpp_lib_constexpr_ cmath Константные выражения для математических функций в <cmath> и <cstdlib> 202202L (C++23) P0533R9
Больше constexpr для <cmath> 202306L (C++26) P1383R2
__cpp_lib_constexpr_ complex Constexpr для std::complex 201711L (C++20) P0415R1
Больше constexpr для <complex> 202306L (C++26) P1383R2
__cpp_lib_constexpr_ deque constexpr std::deque 202502L (C++26) P3372R3
__cpp_lib_constexpr_ dynamic_alloc Константные выражения для std::allocator и связанных утилит 201907L (C++20) P0784R7
__cpp_lib_constexpr_ exceptions constexpr для типов исключений, например std::bad_alloc , std::bad_cast и др. 202411L (C++26) P3068R6
Больше constexpr для типов исключений 202502L P3378R2
__cpp_lib_constexpr_ flat_map constexpr std::flat_map и std::flat_multimap 202502L (C++26) P3372R3
__cpp_lib_constexpr_ flat_set constexpr std::flat_set и std::flat_multiset 202502L (C++26) P3372R3
__cpp_lib_constexpr_ forward_list constexpr std::forward_list 202502L (C++26) P3372R3
__cpp_lib_constexpr_ functional Разное constexpr части ( std::default_searcher ); constexpr INVOKE 201907L (C++20) P1032R1
P1065R2
__cpp_lib_constexpr_ inplace_vector constexpr std::inplace_vector для нетривиальных типов 202502L (C++26) P3074R7
__cpp_lib_constexpr_ iterator Разное constexpr биты ( std::insert_iterator и др.) 201811L (C++20) P1032R1
__cpp_lib_constexpr_ list constexpr std::list 202502L (C++26) P3372R3
__cpp_lib_constexpr_ map constexpr std::map и std::multimap 202502L (C++26) P3372R3
__cpp_lib_constexpr_ memory Constexpr в std::pointer_traits 201811L (C++20) P1006R1
Constexpr std::unique_ptr 202202L (C++23) P2273R3
__cpp_lib_constexpr_ new Константное выражение размещающий new 202406L (C++26) P2747R2
__cpp_lib_constexpr_ numeric Константные выражения для алгоритмов в <numeric> 201911L (C++20) P1645R1
__cpp_lib_constexpr_ queue constexpr std::queue 202502L (C++26) P3372R3
__cpp_lib_constexpr_ set constexpr std::set и std::multiset 202502L (C++26) P3372R3
__cpp_lib_constexpr_ stack constexpr std::stack 202502L (C++26) P3372R3
__cpp_lib_constexpr_ string constexpr std::char_traits 201611L (C++17) P0426R1
constexpr std::string 201907L (C++20) P0980R1
__cpp_lib_constexpr_ string_view Разное constexpr функции ( std::string_view::copy ) 201811L (C++20) P1032R1
__cpp_lib_constexpr_ tuple Разное constexpr возможности ( std::tuple::operator= и др.) 201811L (C++20) P1032R1
__cpp_lib_constexpr_ typeinfo Константное выражение для std::type_info::operator== 202106L (C++23) P1328R1
__cpp_lib_constexpr_ unordered_map constexpr std::unordered_map и std::unordered_multimap 202502L (C++26) P3372R3
__cpp_lib_constexpr_ unordered_set constexpr std::unordered_set и std::unordered_multiset 202502L (C++26) P3372R3
__cpp_lib_constexpr_ utility Разные constexpr части ( std::pair::operator= и др.) 201811L (C++20) P1032R1
__cpp_lib_constexpr_ vector Constexpr для std::vector 201907L (C++20) P1004R2
__cpp_lib_constrained_ equality Ограниченные операторы отношений для std::pair , std::tuple , std::optional , и std::variant 202403L (C++26) P2944R3
Ограничение std::expected операторов равенства 202411L P3379R0
__cpp_lib_containers_ ranges Ranges-aware construction and insertion for containers and strings 202202L (C++23) P1206R7
__cpp_lib_containers_ ranges Ranges-aware конструирование и вставка для контейнеров и строк 202202L (C++23) P1206R7
__cpp_lib_contracts <contracts> : Поддержка контрактов 202502L (C++26) P2900R14
__cpp_lib_copyable_ function std::copyable_function 202306L (C++26) P2548R6
__cpp_lib_coroutine Корутины (поддержка библиотеки) 201902L (C++20) P0912R5
LWG3393
__cpp_lib_debugging <debugging> : Поддержка отладки 202311L (C++26) P2546R5
Заменяемый std::is_debugger_present 202403L P2810R4
__cpp_lib_destroying_ delete Уничтожающий operator delete (поддержка библиотеки) 201806L (C++20) P0722R3
__cpp_lib_enable_ shared_from_this std::enable_shared_from_this::weak_from_this 201603L (C++17) P0033R1
__cpp_lib_endian std::endian 201907L (C++20) P0463R1
P1612R1
__cpp_lib_erase_ if Универсальное удаление элементов контейнера 202002L (C++20) P1209R0
P1115R3
__cpp_lib_exchange_ function std::exchange 201304L (C++14) N3668
__cpp_lib_execution Политики выполнения 201603L (C++17) P0024R2
std::execution::unsequenced_policy 201902L (C++20) P1001R2
__cpp_lib_expected шаблон класса std::expected 202202L (C++23) P0323R12
Монадные функции для std::expected 202211L P2505R5
__cpp_lib_filesystem Библиотека файловой системы 201703L (C++17) P0218R1
P0219R1
P0392R0
P0317R1
__cpp_lib_flat_map std::flat_map и std::flat_multimap 202207L (C++23) P0429R9
__cpp_lib_flat_set std::flat_set и std::flat_multiset 202207L (C++23) P1222R4
LWG3751
__cpp_lib_format Форматирование текста 201907L (C++20) P0645R10
P1361R2
P1652R1
Проверки строки форматирования на этапе компиляции; Сокращение параметризации std::vformat_to 202106L (C++23)
(DR20)
P2216R3
Исправление обработки локалей в форматтерах chrono; Поддержка типов, не являющихся константно-форматируемыми 202110L P2372R3
P2418R2
Предоставление std::basic_format_string ; уточнение обработки кодировок в локализованном форматировании хроно-типов 202207L (C++23) P2419R2
P2508R1
Форматирование указателей 202304L (C++26) P2510R3
Проверка типов аргументов форматирования 202305L P2757R3
Участник visit 202306L P2637R3
Строки форматирования времени выполнения 202311L P2918R2
__cpp_lib_format_ path Форматирование std::filesystem::path 202403L (C++26) P2845R8
__cpp_lib_format_ ranges Форматирование диапазонов 202207L (C++23) P2286R8
P2585R1
LWG3750
__cpp_lib_format_ uchar Исправление форматирования кодовых единиц как целых чисел 202311L (C++26) P2909R4
__cpp_lib_formatters Форматирование std::thread::id и std::stacktrace 202302L (C++23) P2693R1
__cpp_lib_forward_ like std::forward_like 202207L (C++23) P2445R1
__cpp_lib_freestanding_ algorithm Автономные возможности в <algorithm> 202311L (C++26) P2407R5
Автономная библиотека: <algorithm> 202502L P2976R1
__cpp_lib_freestanding_ array Сделать части std::array автономными 202311L (C++26) P2407R5
__cpp_lib_freestanding_ char_traits Автономная реализация std::char_traits 202306L (C++26) P2338R4
__cpp_lib_freestanding_ charconv Автономные возможности в <charconv> 202306L (C++26) P2338R4
__cpp_lib_freestanding_ cstdlib Автономные возможности в <cstdlib> 202306L (C++26) P2338R4
__cpp_lib_freestanding_ cstring Автономные возможности в <cstring> 202306L (C++26) P2338R4
Удаление std::strtok из автономных средств 202311L P2937R0
__cpp_lib_freestanding_ cwchar Автономные возможности в <cwchar> 202306L (C++26) P2338R4
__cpp_lib_freestanding_ errc Freestanding std::errc 202306L (C++26) P2338R4
__cpp_lib_freestanding_ execution Автономная библиотека: <execution> 202502L (C++26) P2976R1
__cpp_lib_freestanding_ expected Сделать части std::expected независимыми от окружения 202311L (C++26) P2833R2
__cpp_lib_freestanding_ feature_test_macros Поддержка автономных макросов тестирования возможностей 202306L (C++26) P2198R7
__cpp_lib_freestanding_ functional Автономные возможности в <functional> 202306L (C++26) P2198R7
__cpp_lib_freestanding_ iterator Автономные возможности в <iterator> 202306L (C++26) P2198R7
__cpp_lib_freestanding_ mdspan Автономная std::mdspan 202311L (C++26) P2833R2
__cpp_lib_freestanding_ memory Автономные возможности в <memory> 202306L (C++26) P2198R7
Автономная библиотека: <memory> 202502L P2976R1
__cpp_lib_freestanding_ numeric Автономные возможности в <numeric> (арифметика с насыщением) 202311L (C++26) P0543R3
Автономная библиотека: <numeric> 202502L P2976R1
__cpp_lib_freestanding_ operator_new Определение operator new (опционально в автономных реализациях) 202306L (C++26) P2198R7
__cpp_lib_freestanding_ optional Создание частей std::optional независимыми от окружения 202311L (C++26) P2407R5
__cpp_lib_freestanding_ random Автономная библиотека: <random> 202502L (C++26) P2976R1
__cpp_lib_freestanding_ ranges Автономные возможности в <ranges> 202306L (C++26) P2198R7
__cpp_lib_freestanding_ ratio Автономные возможности в <ratio> 202306L (C++26) P2198R7
__cpp_lib_freestanding_ string_view Создание частей std::string_view автономными 202311L (C++26) P2407R5
__cpp_lib_freestanding_ tuple Автономные возможности в <tuple> 202306L (C++26) P2198R7
__cpp_lib_freestanding_ utility Автономные возможности в <utility> 202306L (C++26) P2198R7
__cpp_lib_freestanding_ variant Создание частей std::variant независимыми от окружения 202311L (C++26) P2407R5
__cpp_lib_fstream_ native_handle Получение нативных дескрипторов из файловых потоков 202306L (C++26) P1759R6
__cpp_lib_function_ ref std::function_ref : Ссылка на вызываемый объект с удалением типа 202306L (C++26) P0792R14
__cpp_lib_gcd_lcm std::gcd , std::lcm 201606L (C++17) P0295R0
__cpp_lib_generator std::generator : Синхронный генератор корутин для диапазонов 202207L (C++23) P2502R2
__cpp_lib_generic_ associative_lookup Гетерогенный поиск сравнения в ассоциативных контейнерах 201304L (C++14) N3657
__cpp_lib_generic_ unordered_lookup Гетерогенный поиск сравнений в неупорядоченных ассоциативных контейнерах 201811L (C++20) P0919R3
__cpp_lib_hardened_ array Стандартная библиотека с усиленной защитой (присутствует только в защищённой реализации) 202502L (C++26) P3471R4
__cpp_lib_hardened_ basic_string Стандартная библиотека с усиленной защитой (присутствует только в защищённой реализации) 202502L (C++26) P3471R4
__cpp_lib_hardened_ basic_string_view Усиление стандартной библиотеки (присутствует только в усиленной реализации) 202502L (C++26) P3471R4
__cpp_lib_hardened_ bitset Стандартная библиотека с усиленной защитой (присутствует только в защищённой реализации) 202502L (C++26) P3471R4
__cpp_lib_hardened_ deque Усиление стандартной библиотеки (присутствует только в усиленной реализации) 202502L (C++26) P3471R4
__cpp_lib_hardened_ expected Усиление стандартной библиотеки (присутствует только в усиленной реализации) 202502L (C++26) P3471R4
__cpp_lib_hardened_ forward_list Стандартная библиотека с усиленной защитой (доступно только в защищённой реализации) 202502L (C++26) P3471R4
__cpp_lib_hardened_ inplace_vector Усиление стандартной библиотеки (присутствует только в усиленной реализации) 202502L (C++26) P3471R4
__cpp_lib_hardened_ list Стандартная библиотека с усиленной защитой (доступно только в защищённой реализации) 202502L (C++26) P3471R4
__cpp_lib_hardened_ mdspan Стандартная библиотека с усиленной защитой (доступно только в защищённой реализации) 202502L (C++26) P3471R4
__cpp_lib_hardened_ optional Стандартная библиотека с усиленной защитой (доступно только в защищённой реализации) 202502L (C++26) P3471R4
__cpp_lib_hardened_ span Усиление стандартной библиотеки (присутствует только в усиленной реализации) 202502L (C++26) P3471R4
__cpp_lib_hardened_ valarray Стандартная библиотека с усиленной защитой (доступно только в защищённой реализации) 202502L (C++26) P3471R4
__cpp_lib_hardened_ vector Усиление стандартной библиотеки (доступно только в усиленной реализации) 202502L (C++26) P3471R4
__cpp_lib_hardware_ interference_size Constexpr std::hardware_{constructive, destructive}_interference_size 201703L (C++17) P0154R1
__cpp_lib_hive <hive> : контейнер на основе сегментов, который повторно использует ячейки памяти удалённых элементов 202502L (C++26) P0447R28
__cpp_lib_has_unique_ object_representations std::has_unique_object_representations 201606L (C++17) P0258R2
__cpp_lib_hazard_ pointer <hazard_pointer> : Указатели опасности 202306L (C++26) P2530R3
__cpp_lib_hypot 3-аргументная перегрузка std::hypot 201603L (C++17) P0030R1
__cpp_lib_incomplete_ container_elements Минимальная поддержка неполных типов для std::forward_list , std::list и std::vector 201505L (C++17) N4510
__cpp_lib_indirect std::indirect 202502L (C++26) P3019R13
__cpp_lib_inplace_ vector std::inplace_vector : Динамически изменяемый вектор с фиксированной ёмкостью (inplace-хранилище) 202406L (C++26) P0843R14
__cpp_lib_int_pow2 Операции со степенями двойки для целых чисел ( std::has_single_bit , std::bit_ceil , std::bit_floor , std::bit_width ) 202002L (C++20) P0556R3
P1956R1
__cpp_lib_integer_ comparison_functions Функции сравнения целых чисел 202002L (C++20) P0586R2
__cpp_lib_integer_ sequence Компилируемые целочисленные последовательности 201304L (C++14) N3658
__cpp_lib_integral_ constant_callable std::integral_constant::operator() 201304L (C++14) N3545
__cpp_lib_interpolate std::lerp , std::midpoint 201902L (C++20) P0811R3
__cpp_lib_invoke std::invoke 201411L (C++17) N4169
__cpp_lib_invoke_ r std::invoke_r 202106L (C++23) P2136R3
__cpp_lib_ios_noreplace Поддержка эксклюзивного режима для fstreams 202207L (C++23) P2467R1
__cpp_lib_is_aggregate std::is_aggregate 201703L (C++17) LWG2911
__cpp_lib_is_constant_ evaluated std::is_constant_evaluated 201811L (C++20) P0595R2
__cpp_lib_is_final std::is_final 201402L (C++14) LWG2112
__cpp_lib_is_implicit_ lifetime std::is_implicit_lifetime 202302L (C++23) P2674R1
__cpp_lib_is_invocable std::is_invocable , std::invoke_result 201703L (C++17) P0604R0
__cpp_lib_is_layout_ compatible std::is_layout_compatible 201907L (C++20) P0466R5
__cpp_lib_is_nothrow_ convertible std::is_convertible 201806L (C++20) P0758R1
LWG3356
__cpp_lib_is_null_ pointer std::is_null_pointer 201309L (C++14)
(DR11)
LWG2247
__cpp_lib_is_pointer_ interconvertible Трейты указательной взаимопреобразуемости: std::is_pointer_interconvertible_with_class , std::is_pointer_interconvertible_base_of 201907L (C++20) P0466R5
__cpp_lib_is_scoped_ enum std::is_scoped_enum 202011L (C++23) P1048R1
__cpp_lib_is_sufficiently_ aligned std::is_sufficiently_aligned : проверяет предусловие выравнивания указателя 202411L (C++26) P2897R7
__cpp_lib_is_swappable (nothrow-)swappable traits 201603L (C++17) P0185R1
__cpp_lib_is_virtual_ base_of std::is_virtual_base_of : Трейт типа для обнаружения виртуальных базовых классов 202406L (C++26) P2985R0
__cpp_lib_is_within_ lifetime Проверка активности альтернативы объединения ( std::is_within_lifetime ) 202306L (C++26) P2641R4
__cpp_lib_jthread Токен остановки и присоединяемый поток 201911L (C++20) P0660R10
P1869R1
__cpp_lib_latch std::latch 201907L (C++20) P1135R6
__cpp_lib_launder CWG issue 1776 : Замена объектов класса, содержащих ссылочные члены ( std::launder ) 201606L (C++17) P0137R1
__cpp_lib_linalg Интерфейс линейной алгебры на основе свободных функций, основанный на BLAS 202311L (C++26) P1673R13
__cpp_lib_list_remove_ return_type Изменение возвращаемого типа методов remove() , remove_if() и unique() для std::forward_list и std::list 201806L (C++20) P0646R1
__cpp_lib_logical_ traits Логические операции над признаками типов 201510L (C++17) P0013R1
__cpp_lib_make_from_ tuple std::make_from_tuple 201606L (C++17) P0209R2
__cpp_lib_make_reverse_ iterator std::make_reverse_iterator 201402L (C++14) LWG2285
__cpp_lib_make_unique std::make_unique 201304L (C++14) N3656
__cpp_lib_map_try_ emplace std::map::try_emplace , std::map::insert_or_assign 201411L (C++17) N4279
__cpp_lib_math_constants Математические константы 201907L (C++20) P0631R8
__cpp_lib_math_special_ functions Математические специальные функции 201603L (C++17) P0226R1
__cpp_lib_mdspan std::mdspan 202207L (C++23) P0009R18
P2599R2
P2604R0
P2613R1
std::dims для std::mdspan 202406L (C++26) P2389R2
__cpp_lib_memory_ resource std::pmr::memory_resource 201603L (C++17) P0220R1
__cpp_lib_modules Модули стандартной библиотеки std и std.compat 202207L (C++23) P2465R3
__cpp_lib_move_iterator_ concept Сделать std::move_iterator<T*> итератором произвольного доступа 202207L (C++23) P2520R0
__cpp_lib_move_only_ function std::move_only_function 202110L (C++23) P0288R9
__cpp_lib_node_extract Соединение отображений и множеств ( std::map::extract , std::map::merge , insert(node_type) , и т.д.) 201606L (C++17) P0083R3
__cpp_lib_nonmember_ container_access std::size , std::data и std::empty 201411L (C++17) N4280
__cpp_lib_not_fn std::not_fn 201603L (C++17) P0005R4
Разрешить передачу вызываемых объектов в качестве константных шаблонных аргументов в std::not_fn 202306L (C++26) P2714R1
__cpp_lib_null_iterators Нулевые LegacyForwardIterator s 201304L (C++14) N3644
__cpp_lib_optional std::optional 201606L (C++17) P0220R1
P0032R3
P0307R2
Полностью constexpr std::optional 202106L (C++23)
(DR20)
P2231R1
Монадные операции в std::optional 202110L (C++23) P0798R8
LWG3621
__cpp_lib_optional_ range_support std::optional поддержка диапазонов 202406L (C++26) P3168R2
__cpp_lib_out_ptr std::out_ptr , std::inout_ptr 202106L (C++23) P1132R8
Автономная реализация std::out_ptr , std::inout_ptr 202311L (C++26) P2833R2
__cpp_lib_parallel_ algorithm Параллельные алгоритмы 201603L (C++17) P0024R2
__cpp_lib_polymorphic std::polymorphic 202502L (C++26) P3019R13
__cpp_lib_polymorphic_ allocator std::pmr::polymorphic_allocator<> как тип словаря 201902L (C++20) P0339R6
LWG3437
__cpp_lib_print Форматированный вывод 202207L (C++23) P2093R14
Позволить эффективную реализацию std::print 202403L (C++26)
(DR23)
P3107R5
P3235R3
Печать пустых строк с помощью std::println 202403L (C++26) P3142R0
__cpp_lib_quoted_ string_io std::quoted 201304L (C++14) N3654
__cpp_lib_philox_ engine std::philox_engine : Движок генерации случайных чисел на основе счётчика 202406L (C++26) P2075R6
__cpp_lib_ranges Библиотека диапазонов и ограниченные алгоритмы 201911L (C++20) P0896R4
P1035R7
P1716R3
Недопустимые для default-инициализации views 202106L (C++23)
(DR20)
P2325R3
Представления с владением 202110L P2415R2
std::ranges::range_adaptor_closure 202202L (C++23) P2387R3
Ослабление адаптеров диапазонов для поддержки типов только с перемещением 202207L P2494R2
Удаление «отравляющих» перегрузок в ranges::begin , ranges::end , ranges::rbegin , ranges::rend и ranges::size 202211L P2602R2
Ослабление диапазонов для разрешения определенных проекций 202302L P2609R3
Удаление требования общего ссылочного типа из концепций косвенно вызываемых 202406L (C++26)
(DR20)
P2997R1
__cpp_lib_ranges_ as_const std::const_iterator , std::ranges::as_const_view 202207L (C++23) P2278R4
Обеспечение соответствия std::basic_const_iterator конвертируемости его базового типа 202311L (C++26) P2836R1
__cpp_lib_ranges_ as_rvalue std::ranges::as_rvalue_view 202207L (C++23) P2446R2
__cpp_lib_ranges_ cache_latest std::ranges::cache_latest_view 202411L (C++26) P3138R5
__cpp_lib_ranges_ cartesian_product std::ranges::cartesian_product_view 202207L (C++23) P2374R4
P2540R1
__cpp_lib_ranges_ chunk std::ranges::chunk_view 202202L (C++23) P2442R1
__cpp_lib_ranges_ chunk_by std::ranges::chunk_by_view 202202L (C++23) P2443R1
__cpp_lib_ranges_ concat std::ranges::concat_view 202403L (C++26) P2542R8
__cpp_lib_ranges_ contains std::ranges::contains 202207L (C++23) P2302R4
__cpp_lib_ranges_ enumerate std::ranges::enumerate_view 202302L (C++23) P2164R9
__cpp_lib_ranges_ find_last std::ranges::find_last , std::ranges::find_last_if , и std::ranges::find_last_if_not 202207L (C++23) P1223R5
LWG3807
__cpp_lib_ranges_ fold std::ranges алгоритмы свертки 202207L (C++23) P2322R6
__cpp_lib_ranges_ generate_random API векторов для генерации случайных чисел ( std::ranges::generate_random ) 202403L (C++26) P1068R11
__cpp_lib_ranges_ iota std::ranges::iota 202202L (C++23) P2440R1
__cpp_lib_ranges_ join_with std::ranges::join_with_view 202202L (C++23) P2441R2
__cpp_lib_ranges_ repeat std::ranges::repeat_view 202207L (C++23) P2474R2
__cpp_lib_ranges_ reserve_hint std::ranges::approximately_sized_range и std::ranges::reserve_hint 202502L (C++26) P2846R6
__cpp_lib_ranges_ slide std::ranges::slide_view 202202L (C++23) P2442R1
__cpp_lib_ranges_ starts_ends_with std::ranges::starts_with , std::ranges::ends_with 202106L (C++23) P1659R3
__cpp_lib_ranges_ stride std::ranges::stride_view 202207L (C++23) P1899R3
__cpp_lib_ranges_ to_container std::ranges::to 202202L (C++23) P1206R7
__cpp_lib_ranges_ to_input std::ranges::to_input_view 202502L (C++26) P3137R3
__cpp_lib_ranges_ zip std::ranges::zip_view , std::ranges::zip_transform_view , std::ranges::adjacent_view , std::ranges::adjacent_transform_view 202110L (C++23) P2321R2
__cpp_lib_ratio Добавление новых префиксов СИ 2022 года 202306L (C++26) P2734R0
__cpp_lib_raw_memory_ algorithms Расширение инструментов управления памятью 201606L (C++17) P0040R3
constexpr для специализированных алгоритмов работы с памятью 202411L (C++26) P3508R0
P3369R0
__cpp_lib_rcu <rcu> : Read-Copy Update (RCU) 202306L (C++26) P2545R4
__cpp_lib_reference_ from_temporary std::reference_constructs_from_temporary и std::reference_converts_from_temporary 202202L (C++23) P2255R2
__cpp_lib_reference_ wrapper Сравнения для std::reference_wrapper 202403L (C++26) P2944R3
__cpp_lib_remove_ cvref std::remove_cvref 201711L (C++20) P0550R2
__cpp_lib_result_ of_sfinae std::result_of и SFINAE 201210L (C++14) N3462
__cpp_lib_robust_ nonmodifying_seq_ops Повышение надежности немодифицирующих операций с последовательностями (перегрузки для двух диапазонов std::mismatch , std::equal и std::is_permutation ) 201304L (C++14) N3671
__cpp_lib_sample std::sample 201603L (C++17) P0220R1
__cpp_lib_saturation_ arithmetic Арифметика с насыщением 202311L (C++26) P0543R3
__cpp_lib_scoped_ lock std::scoped_lock 201703L (C++17) P0156R2
__cpp_lib_semaphore std::counting_semaphore , std::binary_semaphore 201907L (C++20) P1135R6
__cpp_lib_senders std::execution : Модель отправитель-получатель для управления выполнением 202406L (C++26) P2300R10
__cpp_lib_shared_ mutex std::shared_mutex (без временных ограничений) 201505L (C++17) N4508
__cpp_lib_shared_ ptr_arrays std::shared_ptr<T[]> 201611L (C++17) P0497R0
Поддержка массивов для std::make_shared 201707L (C++20) P0674R1
__cpp_lib_shared_ ptr_weak_type shared_ptr::weak_type 201606L (C++17) P0163R0
__cpp_lib_shared_ timed_mutex std::shared_timed_mutex 201402L (C++14) N3891
__cpp_lib_shift std::shift_left и std::shift_right 201806L (C++20) P0769R2
std::ranges::shift_left и std::ranges::shift_right 202202L (C++23) P2440R1
__cpp_lib_simd <simd> : Типы для параллельной обработки данных 202411L (C++26) P1928R15
P3430R3
P3441R2
P3287R3
P2933R4
__cpp_lib_simd_complex Поддержка перемежающихся комплексных значений в std::datapar::simd 202502L (C++26) P2663R7
__cpp_lib_smart_ ptr_for_overwrite Создание умных указателей с инициализацией по умолчанию ( std::allocate_shared_for_overwrite , std::make_shared_for_overwrite , std::make_unique_for_overwrite ) 202002L (C++20) P1020R1
P1973R1
__cpp_lib_smart_ ptr_owner_equality Включение возможности использования std::weak_ptr в качестве ключей в неупорядоченных ассоциативных контейнерах 202306L (C++26) P1901R2
__cpp_lib_source_ location Захват информации об исходном коде ( std::source_location ) 201907L (C++20) P1208R6
__cpp_lib_span std::span 202002L (C++20) P0122R7
LWG3274
P1024R3
P1976R2
Сделать части std::span независимыми 202311L (C++26) P2821R5
P2833R2
__cpp_lib_span_initializer_ list Конструирование std::span из списка инициализации 202311L (C++26) P2447R6
__cpp_lib_spanstream std::spanbuf , std::spanstream 202106L (C++23) P0448R4
__cpp_lib_ssize std::ssize и беззнаковый std::span::size 201902L (C++20) P1227R2
__cpp_lib_sstream_ from_string_view Взаимодействие std::stringstream с std::string_view 202306L (C++26) P2495R3
__cpp_lib_stacktrace Библиотека трассировки стека 202011L (C++23) P0881R7
__cpp_lib_start_ lifetime_as Явное управление временем жизни ( std::start_lifetime_as ) 202207L (C++23) P2590R2
__cpp_lib_starts_ ends_with Проверка префикса и суффикса строки ( starts_with() и ends_with() для std::string и std::string_view ) 201711L (C++20) P0457R2
__cpp_lib_stdatomic_ h Заголовок совместимости для атомарных операций C 202011L (C++23) P0943R6
__cpp_lib_string_ contains contains() для std::basic_string и std::basic_string_view 202011L (C++23) P1679R3
__cpp_lib_string_ resize_and_overwrite std::basic_string::resize_and_overwrite 202110L (C++23) P1072R10
__cpp_lib_string_ udls Пользовательские литералы для строковых типов 201304L (C++14) N3642
__cpp_lib_string_ view std::string_view 201606L (C++17) P0220R1
P0254R2
ConstexprIterator 201803L (C++20) P0858R0
LWG3257
Конкатенация строк std::string и std::string_view 202403L (C++26) P2591R5
__cpp_lib_submdspan std::submdspan 202306L (C++26) P2630R4
Макеты mdspan с заполнением 202403L P2642R6
__cpp_lib_syncbuf Синхронизированный буферизованный ostream ( std::syncbuf , std::osyncstream ) и манипуляторы 201803L (C++20) P0053R7
P0753R2
__cpp_lib_text_encoding std::text_encoding 202306L (C++26) P1885R12
__cpp_lib_three_ way_comparison Трехстороннее сравнение (поддержка библиотеки); добавление трехстороннего сравнения в библиотеку 201907L (C++20) P0768R1
P1614R2
__cpp_lib_to_address Утилита для преобразования указателя в сырой указатель ( std::to_address ) 201711L (C++20) P0653R2
__cpp_lib_to_array std::to_array 201907L (C++20) P0325R4
__cpp_lib_to_chars Элементарные преобразования строк ( std::to_chars , std::from_chars ) 201611L (C++17) P0067R5
P0682R1
LWG3137
Тестирование на успех или неудачу функций <charconv> 202306L (C++26) P2497R0
__cpp_lib_to_string Переопределение std::to_string в терминах std::format 202306L (C++26) P2587R3
__cpp_lib_to_underlying std::to_underlying 202102L (C++23) P1682R3
__cpp_lib_transformation_ trait_aliases Псевдонимы шаблонов для transformation traits 201304L (C++14) N3655
__cpp_lib_transparent_ operators Прозрачные функциональные объекты операторов ( std::less<> и др.) 201210L (C++14) N3421
Прозрачный std::owner_less ( std::owner_less<void> ) 201510L (C++17) P0074R0
__cpp_lib_trivially_ relocatable Тривиальные характеристики и операции перемещаемости 202502L (C++26) P2786R13
__cpp_lib_tuple_ element_t std::tuple_element_t 201402L (C++14) N3887
__cpp_lib_tuple_ like Совместимость между std::tuple и tuple-like объектами ( std::pair , std::array , std::subrange ) 202207L (C++23) P2165R4
Добавить протокол кортежа к std::complex 202311L (C++26) P2819R2
__cpp_lib_tuples_ by_type Обращение к кортежам по типу 201304L (C++14) N3670
__cpp_lib_type_identity std::type_identity 201806L (C++20) P0887R1
__cpp_lib_type_trait_ variable_templates Шаблоны переменных type traits ( std::is_void_v , и др.) 201510L (C++17) P0006R0
__cpp_lib_uncaught_ exceptions std::uncaught_exceptions 201411L (C++17) N4259
__cpp_lib_unordered_ map_try_emplace std::unordered_map::try_emplace , std::unordered_map::insert_or_assign 201411L (C++17) N4279
__cpp_lib_unreachable std::unreachable 202202L (C++23) P0627R6
__cpp_lib_unwrap_ ref std::unwrap_ref_decay и std::unwrap_reference 201811L (C++20) P0318R1
LWG3348
__cpp_lib_variant std::variant : Типобезопасное объединение для C++17 201606L (C++17) P0088R3
P0393R3
P0032R3
std::visit для классов, производных от std::variant 202102L (C++23)
(DR17)
P2162R2
Полностью constexpr std::variant 202106L (C++23)
(DR20)
P2231R1
Член visit 202306L (C++26) P2637R3
__cpp_lib_void_t std::void_t 201411L (C++17) N3911
Общее количество макросов: 282

Пример

Обычное использование

#ifdef __has_include                           // Проверить наличие __has_include
#  if __has_include(<optional>)                // Проверить наличие стандартной библиотеки
#    include <optional>
#  elif __has_include(<experimental/optional>) // Проверить наличие экспериментальной версии
#    include <experimental/optional>
#  elif __has_include(<boost/optional.hpp>)    // Попробовать с внешней библиотекой
#    include <boost/optional.hpp>
#  else                                        // Не найдено вообще
#     error "Missing <optional>"
#  endif
#endif
#ifdef __has_cpp_attribute                      // Проверить наличие __has_cpp_attribute
#  if __has_cpp_attribute(deprecated)           // Проверить наличие атрибута
#    define DEPRECATED(msg) [[deprecated(msg)]]
#  endif
#endif
#ifndef DEPRECATED
#    define DEPRECATED(msg)
#endif
DEPRECATED("foo() has been deprecated") void foo();
#if __cpp_constexpr >= 201304                // Проверить конкретную версию функции
#  define CONSTEXPR constexpr
#else
#  define CONSTEXPR inline
#endif
CONSTEXPR int bar(unsigned i)
{
#if __cpp_binary_literals                    // Проверить наличие функции
    unsigned mask1 = 0b11000000;
    unsigned mask2 = 0b00000111;
#else
    unsigned mask1 = 0xC0;
    unsigned mask2 = 0x07;
#endif
    if (i & mask1)
        return 1;
    if (i & mask2)
        return 2;
    return 0;
}
int main() {}

Дамп функций компилятора

Следующая (совместимая с C++11) программа выводит возможности и атрибуты компилятора C++. Обратите внимание, что использование __has_cpp_attribute ( ) не является соответствующим стандарту и зависит от реализации gcc/clang.

static constexpr struct choose_what_and_how_to_print
{
    constexpr static int longest_macro_name { 45 };
    constexpr static bool titles               = 1;
    constexpr static bool counters             = 1;
    constexpr static bool attributes           = 1;
    constexpr static bool standard_values      = 1;
    constexpr static bool compiler_specific    = 1;
    constexpr static bool core_features        = 1;
    constexpr static bool lib_features         = 1;
    constexpr static bool supported_features   = 1;
    constexpr static bool unsupported_features = 1;
    constexpr static bool sort_by_date         = 0;
    constexpr static bool separate_year_month  = 1;
    constexpr static bool separated_revisions  = 1;
    constexpr static bool latest_revisions     = 1;
    constexpr static bool cxx98                = 0;
    constexpr static bool cxx11                = 1;
    constexpr static bool cxx14                = 1;
    constexpr static bool cxx17                = 1;
    constexpr static bool cxx20                = 1;
    constexpr static bool cxx23                = 1;
    constexpr static bool cxx26                = 1;
    constexpr static bool cxx29                = 0;
} print;
#if __cplusplus < 201100
#  error "Требуется C++11 или новее"
#endif
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <utility>
#include <vector>
#ifdef __has_include
# if __has_include(<version>)
#   include <version>
# endif
# if __has_include(<stdfloat>)
#   include <stdfloat>
# endif
#endif
// Ожидается строка, начинающаяся с 6 десятичных цифр или с '_' (если не поддерживается)
#define COMPILER_VALUE_INT(n) #n [0] == '_' ? 0 : \
    (#n[5] - '0') + (#n[4] - '0') * 10 + (#n[3] - '0') * 100 + \
    (#n[2] - '0') * 1000 + (#n[1] - '0') * 10000 + (#n[0] - '0') * 100000
#define COMPILER_FEATURE_ENTRY(expect, name) { #name, COMPILER_VALUE_INT(name), expect },
#if defined(__has_cpp_attribute) && defined(__GNUG__)
# define COMPILER_ATTRIBUTE(expect, name) { #name, __has_cpp_attribute(name), expect },
#else
# define COMPILER_ATTRIBUTE(expect, name) { #name, COMPILER_VALUE_INT(name), expect },
#endif
#define COMPILER_SPECIFIC_STRING(value) #value
#define COMPILER_SPECIFIC_ENTRY(name) { #name, COMPILER_SPECIFIC_STRING(name) },
class CompilerFeature
{
    char const* name_; long data_; long std_;
public:
    constexpr CompilerFeature(char const* name, long data, long std)
        : name_(name), data_(data), std_(std) {}
    constexpr CompilerFeature(CompilerFeature const&) = default;
    CompilerFeature& operator=(CompilerFeature const&) = default;
    bool operator<(CompilerFeature const& rhs) const
        { return std::strcmp(name_, rhs.name_) < 0; }
    bool operator==(CompilerFeature const& rhs) const
        { return std::strcmp(name_, rhs.name_) == 0; }
    constexpr bool supported() const { return data_ >= std_; }
    constexpr bool maybe() const { return data_ > 0; }
    constexpr char const* name() const { return name_; }
    constexpr long std() const { return std_; }
    constexpr long data() const { return data_; }
    void data(long x) { data_ = x; }
};
// Макросы без FTM, включая специфичные для реализации:
static /*constexpr*/ std::pair<const char*, const char*> compiler[] = {
    COMPILER_SPECIFIC_ENTRY(__cplusplus)
    COMPILER_SPECIFIC_ENTRY(__clang_major__)
    COMPILER_SPECIFIC_ENTRY(__clang_minor__)
    COMPILER_SPECIFIC_ENTRY(__clang_patchlevel__)
    COMPILER_SPECIFIC_ENTRY(__GNUG__)
    COMPILER_SPECIFIC_ENTRY(__GNUC_MINOR__)
    COMPILER_SPECIFIC_ENTRY(__GNUC_PATCHLEVEL__)
    // Optional <stdfloat> fixed width floating-point types (C++23)
    COMPILER_SPECIFIC_ENTRY(__STDCPP_FLOAT16_T__)
    COMPILER_SPECIFIC_ENTRY(__STDCPP_FLOAT32_T__)
    COMPILER_SPECIFIC_ENTRY(__STDCPP_FLOAT64_T__)
    COMPILER_SPECIFIC_ENTRY(__STDCPP_FLOAT128_T__)
    COMPILER_SPECIFIC_ENTRY(__STDCPP_BFLOAT16_T__)
    // C23 => C++26
    COMPILER_SPECIFIC_ENTRY(__STDC_ENDIAN_BIG__)
    COMPILER_SPECIFIC_ENTRY(__STDC_ENDIAN_LITTLE__)
    COMPILER_SPECIFIC_ENTRY(__STDC_ENDIAN_NATIVE__)
    COMPILER_SPECIFIC_ENTRY(__STDC_VERSION_STDBIT_H__)
    COMPILER_SPECIFIC_ENTRY(__STDC_VERSION_STDCKDINT_H__)
    // Добавьте ваши любимые макросы, специфичные для реализации...
    COMPILER_SPECIFIC_ENTRY(__STDCPP_DEFAULT_NEW_ALIGNMENT__)
    COMPILER_SPECIFIC_ENTRY(__STDCPP_THREADS__)
    COMPILER_SPECIFIC_ENTRY(__STDCPP_STRICT_POINTER_SAFETY__)
    COMPILER_SPECIFIC_ENTRY(__STDC_EMBED_NOT_FOUND__)
    COMPILER_SPECIFIC_ENTRY(__STDC_EMBED_FOUND__)
    COMPILER_SPECIFIC_ENTRY(__STDC_EMBED_EMPTY__)
    COMPILER_SPECIFIC_ENTRY(__STDC__)
    COMPILER_SPECIFIC_ENTRY(__STDC_VERSION__)
    COMPILER_SPECIFIC_ENTRY(__STDC_HOSTED__)
    COMPILER_SPECIFIC_ENTRY(__STDC_ISO_10646__)
    COMPILER_SPECIFIC_ENTRY(__STDC_MB_MIGHT_NEQ_WC__)
    COMPILER_SPECIFIC_ENTRY(__DATE__)
    COMPILER_SPECIFIC_ENTRY(__TIME__)
};
static constexpr CompilerFeature cxx98_core[] = {
    COMPILER_FEATURE_ENTRY(199711L, __cpp_exceptions)
    COMPILER_FEATURE_ENTRY(199711L, __cpp_rtti)
};
static constexpr CompilerFeature cxx11_core[] = {
    COMPILER_FEATURE_ENTRY(200704L, __cpp_alias_templates)
    COMPILER_FEATURE_ENTRY(200809L, __cpp_attributes)
    COMPILER_FEATURE_ENTRY(200704L, __cpp_constexpr)
    COMPILER_FEATURE_ENTRY(201711L, __cpp_constexpr_in_decltype)
    COMPILER_FEATURE_ENTRY(200707L, __cpp_decltype)
    COMPILER_FEATURE_ENTRY(200604L, __cpp_delegating_constructors)
    COMPILER_FEATURE_ENTRY(201511L, __cpp_inheriting_constructors)
    COMPILER_FEATURE_ENTRY(200806L, __cpp_initializer_lists)
    COMPILER_FEATURE_ENTRY(200907L, __cpp_lambdas)
    COMPILER_FEATURE_ENTRY(200809L, __cpp_nsdmi)
    COMPILER_FEATURE_ENTRY(200907L, __cpp_range_based_for)
    COMPILER_FEATURE_ENTRY(200710L, __cpp_raw_strings)
    COMPILER_FEATURE_ENTRY(200710L, __cpp_ref_qualifiers)
    COMPILER_FEATURE_ENTRY(200610L, __cpp_rvalue_references)
    COMPILER_FEATURE_ENTRY(200410L, __cpp_static_assert)
    COMPILER_FEATURE_ENTRY(200806L, __cpp_threadsafe_static_init)
    COMPILER_FEATURE_ENTRY(200704L, __cpp_unicode_characters)
    COMPILER_FEATURE_ENTRY(200710L, __cpp_unicode_literals)
    COMPILER_FEATURE_ENTRY(200809L, __cpp_user_defined_literals)
    COMPILER_FEATURE_ENTRY(200704L, __cpp_variadic_templates)
};
static constexpr CompilerFeature cxx14_core[] = {
    COMPILER_FEATURE_ENTRY(201304L, __cpp_aggregate_nsdmi)
    COMPILER_FEATURE_ENTRY(201304L, __cpp_binary_literals)
    COMPILER_FEATURE_ENTRY(201304L, __cpp_constexpr)
    COMPILER_FEATURE_ENTRY(201304L, __cpp_decltype_auto)
    COMPILER_FEATURE_ENTRY(201304L, __cpp_generic_lambdas)
    COMPILER_FEATURE_ENTRY(201304L, __cpp_init_captures)
    COMPILER_FEATURE_ENTRY(201304L, __cpp_return_type_deduction)
    COMPILER_FEATURE_ENTRY(201309L, __cpp_sized_deallocation)
    COMPILER_FEATURE_ENTRY(201304L, __cpp_variable_templates)
};
static constexpr CompilerFeature cxx14_lib[] = {
    COMPILER_FEATURE_ENTRY(201304L, __cpp_lib_chrono_udls)
    COMPILER_FEATURE_ENTRY(201309L, __cpp_lib_complex_udls)
    COMPILER_FEATURE_ENTRY(201304L, __cpp_lib_exchange_function)
    COMPILER_FEATURE_ENTRY(201304L, __cpp_lib_generic_associative_lookup)
    COMPILER_FEATURE_ENTRY(201304L, __cpp_lib_integer_sequence)
    COMPILER_FEATURE_ENTRY(201304L, __cpp_lib_integral_constant_callable)
    COMPILER_FEATURE_ENTRY(201402L, __cpp_lib_is_final)
    COMPILER_FEATURE_ENTRY(201309L, __cpp_lib_is_null_pointer)
    COMPILER_FEATURE_ENTRY(201402L, __cpp_lib_make_reverse_iterator)
    COMPILER_FEATURE_ENTRY(201304L, __cpp_lib_make_unique)
    COMPILER_FEATURE_ENTRY(201304L, __cpp_lib_null_iterators)
    COMPILER_FEATURE_ENTRY(201304L, __cpp_lib_quoted_string_io)
    COMPILER_FEATURE_ENTRY(201210L, __cpp_lib_result_of_sfinae)
    COMPILER_FEATURE_ENTRY(201304L, __cpp_lib_robust_nonmodifying_seq_ops)
    COMPILER_FEATURE_ENTRY(201402L, __cpp_lib_shared_timed_mutex)
    COMPILER_FEATURE_ENTRY(201304L, __cpp_lib_string_udls)
    COMPILER_FEATURE_ENTRY(201304L, __cpp_lib_transformation_trait_aliases)
    COMPILER_FEATURE_ENTRY(201210L, __cpp_lib_transparent_operators)
    COMPILER_FEATURE_ENTRY(201402L, __cpp_lib_tuple_element_t)
    COMPILER_FEATURE_ENTRY(201304L, __cpp_lib_tuples_by_type)
};
static constexpr CompilerFeature cxx17_core[] = {
    COMPILER_FEATURE_ENTRY(201603L, __cpp_aggregate_bases)
    COMPILER_FEATURE_ENTRY(201606L, __cpp_aligned_new)
    COMPILER_FEATURE_ENTRY(201603L, __cpp_capture_star_this)
    COMPILER_FEATURE_ENTRY(201603L, __cpp_constexpr)
    COMPILER_FEATURE_ENTRY(201703L, __cpp_deduction_guides)
    COMPILER_FEATURE_ENTRY(201411L, __cpp_enumerator_attributes)
    COMPILER_FEATURE_ENTRY(201603L, __cpp_fold_expressions)
    COMPILER_FEATURE_ENTRY(201606L, __cpp_guaranteed_copy_elision)
    COMPILER_FEATURE_ENTRY(201603L, __cpp_hex_float)
    COMPILER_FEATURE_ENTRY(201606L, __cpp_if_constexpr)
    COMPILER_FEATURE_ENTRY(201606L, __cpp_inline_variables)
    COMPILER_FEATURE_ENTRY(201411L, __cpp_namespace_attributes)
    COMPILER_FEATURE_ENTRY(201510L, __cpp_noexcept_function_type)
    COMPILER_FEATURE_ENTRY(201411L, __cpp_nontype_template_args)
    COMPILER_FEATURE_ENTRY(201606L, __cpp_nontype_template_parameter_auto)
    COMPILER_FEATURE_ENTRY(201603L, __cpp_range_based_for)
    COMPILER_FEATURE_ENTRY(201411L, __cpp_static_assert)
    COMPILER_FEATURE_ENTRY(201606L, __cpp_structured_bindings)
    COMPILER_FEATURE_ENTRY(201611L, __cpp_template_template_args)
    COMPILER_FEATURE_ENTRY(201611L, __cpp_variadic_using)
};
static constexpr CompilerFeature cxx17_lib[] = {
    COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_addressof_constexpr)
    COMPILER_FEATURE_ENTRY(201411L, __cpp_lib_allocator_traits_is_always_equal)
    COMPILER_FEATURE_ENTRY(201606L, __cpp_lib_any)
    COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_apply)
    COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_array_constexpr)
    COMPILER_FEATURE_ENTRY(201510L, __cpp_lib_as_const)
    COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_atomic_is_always_lock_free)
    COMPILER_FEATURE_ENTRY(201505L, __cpp_lib_bool_constant)
    COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_boyer_moore_searcher)
    COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_byte)
    COMPILER_FEATURE_ENTRY(201611L, __cpp_lib_chrono)
    COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_clamp)
    COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_enable_shared_from_this)
    COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_execution)
    COMPILER_FEATURE_ENTRY(201703L, __cpp_lib_filesystem)
    COMPILER_FEATURE_ENTRY(201606L, __cpp_lib_gcd_lcm)
    COMPILER_FEATURE_ENTRY(201703L, __cpp_lib_hardware_interference_size)
    COMPILER_FEATURE_ENTRY(201606L, __cpp_lib_has_unique_object_representations)
    COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_hypot)
    COMPILER_FEATURE_ENTRY(201505L, __cpp_lib_incomplete_container_elements)
    COMPILER_FEATURE_ENTRY(201411L, __cpp_lib_invoke)
    COMPILER_FEATURE_ENTRY(201703L, __cpp_lib_is_aggregate)
    COMPILER_FEATURE_ENTRY(201703L, __cpp_lib_is_invocable)
    COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_is_swappable)
    COMPILER_FEATURE_ENTRY(201606L, __cpp_lib_launder)
    COMPILER_FEATURE_ENTRY(201510L, __cpp_lib_logical_traits)
    COMPILER_FEATURE_ENTRY(201606L, __cpp_lib_make_from_tuple)
    COMPILER_FEATURE_ENTRY(201411L, __cpp_lib_map_try_emplace)
    COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_math_special_functions)
    COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_memory_resource)
    COMPILER_FEATURE_ENTRY(201606L, __cpp_lib_node_extract)
    COMPILER_FEATURE_ENTRY(201411L, __cpp_lib_nonmember_container_access)
    COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_not_fn)
    COMPILER_FEATURE_ENTRY(201606L, __cpp_lib_optional)
    COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_parallel_algorithm)
    COMPILER_FEATURE_ENTRY(201606L, __cpp_lib_raw_memory_algorithms)
    COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_sample)
    COMPILER_FEATURE_ENTRY(201703L, __cpp_lib_scoped_lock)
    COMPILER_FEATURE_ENTRY(201505L, __cpp_lib_shared_mutex)
    COMPILER_FEATURE_ENTRY(201611L, __cpp_lib_shared_ptr_arrays)
    COMPILER_FEATURE_ENTRY(201606L, __cpp_lib_shared_ptr_weak_type)
    COMPILER_FEATURE_ENTRY(201606L, __cpp_lib_string_view)
    COMPILER_FEATURE_ENTRY(201611L, __cpp_lib_to_chars)
    COMPILER_FEATURE_ENTRY(201510L, __cpp_lib_transparent_operators)
    COMPILER_FEATURE_ENTRY(201510L, __cpp_lib_type_trait_variable_templates)
    COMPILER_FEATURE_ENTRY(201411L, __cpp_lib_uncaught_exceptions)
    COMPILER_FEATURE_ENTRY(201411L, __cpp_lib_unordered_map_try_emplace)
    COMPILER_FEATURE_ENTRY(202102L, __cpp_lib_variant)
    COMPILER_FEATURE_ENTRY(201411L, __cpp_lib_void_t)
};
static constexpr CompilerFeature cxx20_core[] = {
    COMPILER_FEATURE_ENTRY(201902L, __cpp_aggregate_paren_init)
    COMPILER_FEATURE_ENTRY(202207L, __cpp_char8_t)
    COMPILER_FEATURE_ENTRY(202002L, __cpp_concepts)
    COMPILER_FEATURE_ENTRY(201806L, __cpp_conditional_explicit)
    COMPILER_FEATURE_ENTRY(202211L, __cpp_consteval)
    COMPILER_FEATURE_ENTRY(202002L, __cpp_constexpr)
    COMPILER_FEATURE_ENTRY(201907L, __cpp_constexpr_dynamic_alloc)
    COMPILER_FEATURE_ENTRY(201907L, __cpp_constinit)
    COMPILER_FEATURE_ENTRY(201907L, __cpp_deduction_guides)
    COMPILER_FEATURE_ENTRY(201707L, __cpp_designated_initializers)
    COMPILER_FEATURE_ENTRY(201707L, __cpp_generic_lambdas)
    COMPILER_FEATURE_ENTRY(201902L, __cpp_impl_coroutine)
    COMPILER_FEATURE_ENTRY(201806L, __cpp_impl_destroying_delete)
    COMPILER_FEATURE_ENTRY(201907L, __cpp_impl_three_way_comparison)
    COMPILER_FEATURE_ENTRY(201803L, __cpp_init_captures)
    COMPILER_FEATURE_ENTRY(201907L, __cpp_modules)
    COMPILER_FEATURE_ENTRY(201911L, __cpp_nontype_template_args)
    COMPILER_FEATURE_ENTRY(201907L, __cpp_using_enum)
};
static constexpr CompilerFeature cxx20_lib[] = {
    COMPILER_FEATURE_ENTRY(201811L, __cpp_lib_array_constexpr)
    COMPILER_FEATURE_ENTRY(201811L, __cpp_lib_assume_aligned)
    COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_atomic_flag_test)
    COMPILER_FEATURE_ENTRY(201711L, __cpp_lib_atomic_float)
    COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_atomic_lock_free_type_aliases)
    COMPILER_FEATURE_ENTRY(201806L, __cpp_lib_atomic_ref)
    COMPILER_FEATURE_ENTRY(201711L, __cpp_lib_atomic_shared_ptr)
    COMPILER_FEATURE_ENTRY(201911L, __cpp_lib_atomic_value_initialization)
    COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_atomic_wait)
    COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_barrier)
    COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_bind_front)
    COMPILER_FEATURE_ENTRY(201806L, __cpp_lib_bit_cast)
    COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_bitops)
    COMPILER_FEATURE_ENTRY(201902L, __cpp_lib_bounded_array_traits)
    COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_char8_t)
    COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_chrono)
    COMPILER_FEATURE_ENTRY(202002L, __cpp_lib_concepts)
    COMPILER_FEATURE_ENTRY(201806L, __cpp_lib_constexpr_algorithms)
    COMPILER_FEATURE_ENTRY(201711L, __cpp_lib_constexpr_complex)
    COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_constexpr_dynamic_alloc)
    COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_constexpr_functional)
    COMPILER_FEATURE_ENTRY(201811L, __cpp_lib_constexpr_iterator)
    COMPILER_FEATURE_ENTRY(201811L, __cpp_lib_constexpr_memory)
    COMPILER_FEATURE_ENTRY(201911L, __cpp_lib_constexpr_numeric)
    COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_constexpr_string)
    COMPILER_FEATURE_ENTRY(201811L, __cpp_lib_constexpr_string_view)
    COMPILER_FEATURE_ENTRY(201811L, __cpp_lib_constexpr_tuple)
    COMPILER_FEATURE_ENTRY(201811L, __cpp_lib_constexpr_utility)
    COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_constexpr_vector)
    COMPILER_FEATURE_ENTRY(201902L, __cpp_lib_coroutine)
    COMPILER_FEATURE_ENTRY(201806L, __cpp_lib_destroying_delete)
    COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_endian)
    COMPILER_FEATURE_ENTRY(202002L, __cpp_lib_erase_if)
    COMPILER_FEATURE_ENTRY(201902L, __cpp_lib_execution)
    COMPILER_FEATURE_ENTRY(202110L, __cpp_lib_format)
    COMPILER_FEATURE_ENTRY(201811L, __cpp_lib_generic_unordered_lookup)
    COMPILER_FEATURE_ENTRY(202002L, __cpp_lib_int_pow2)
    COMPILER_FEATURE_ENTRY(202002L, __cpp_lib_integer_comparison_functions)
    COMPILER_FEATURE_ENTRY(201902L, __cpp_lib_interpolate)
    COMPILER_FEATURE_ENTRY(201811L, __cpp_lib_is_constant_evaluated)
    COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_is_layout_compatible)
    COMPILER_FEATURE_ENTRY(201806L, __cpp_lib_is_nothrow_convertible)
    COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_is_pointer_interconvertible)
    COMPILER_FEATURE_ENTRY(201911L, __cpp_lib_jthread)
    COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_latch)
    COMPILER_FEATURE_ENTRY(201806L, __cpp_lib_list_remove_return_type)
    COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_math_constants)
    COMPILER_FEATURE_ENTRY(202106L, __cpp_lib_optional)
    COMPILER_FEATURE_ENTRY(201902L, __cpp_lib_polymorphic_allocator)
    COMPILER_FEATURE_ENTRY(202110L, __cpp_lib_ranges)
    COMPILER_FEATURE_ENTRY(201711L, __cpp_lib_remove_cvref)
    COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_semaphore)
    COMPILER_FEATURE_ENTRY(201707L, __cpp_lib_shared_ptr_arrays)
    COMPILER_FEATURE_ENTRY(201806L, __cpp_lib_shift)
    COMPILER_FEATURE_ENTRY(202002L, __cpp_lib_smart_ptr_for_overwrite)
    COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_source_location)
    COMPILER_FEATURE_ENTRY(202002L, __cpp_lib_span)
    COMPILER_FEATURE_ENTRY(201902L, __cpp_lib_ssize)
    COMPILER_FEATURE_ENTRY(201711L, __cpp_lib_starts_ends_with)
    COMPILER_FEATURE_ENTRY(201803L, __cpp_lib_string_view)
    COMPILER_FEATURE_ENTRY(201803L, __cpp_lib_syncbuf)
    COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_three_way_comparison)
    COMPILER_FEATURE_ENTRY(201711L, __cpp_lib_to_address)
    COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_to_array)
    COMPILER_FEATURE_ENTRY(201806L, __cpp_lib_type_identity)
    COMPILER_FEATURE_ENTRY(201811L, __cpp_lib_unwrap_ref)
    COMPILER_FEATURE_ENTRY(202106L, __cpp_lib_variant)
};
static constexpr CompilerFeature cxx23_core[] = {
    COMPILER_FEATURE_ENTRY(202110L, __cpp_auto_cast)
    COMPILER_FEATURE_ENTRY(202211L, __cpp_constexpr)
    COMPILER_FEATURE_ENTRY(202110L, __cpp_explicit_this_parameter)
    COMPILER_FEATURE_ENTRY(202106L, __cpp_if_consteval)
    COMPILER_FEATURE_ENTRY(202207L, __cpp_implicit_move)
    COMPILER_FEATURE_ENTRY(202211L, __cpp_multidimensional_subscript)
    COMPILER_FEATURE_ENTRY(202207L, __cpp_named_character_escapes)
    COMPILER_FEATURE_ENTRY(202211L, __cpp_range_based_for)
    COMPILER_FEATURE_ENTRY(202011L, __cpp_size_t_suffix)
    COMPILER_FEATURE_ENTRY(202207L, __cpp_static_call_operator)
};
static constexpr CompilerFeature cxx23_lib[] = {
    COMPILER_FEATURE_ENTRY(202106L, __cpp_lib_adaptor_iterator_pair_constructor)
    COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_algorithm_iterator_requirements)
    COMPILER_FEATURE_ENTRY(202302L, __cpp_lib_allocate_at_least)
    COMPILER_FEATURE_ENTRY(202110L, __cpp_lib_associative_heterogeneous_erasure)
    COMPILER_FEATURE_ENTRY(202302L, __cpp_lib_barrier)
    COMPILER_FEATURE_ENTRY(202202L, __cpp_lib_bind_back)
    COMPILER_FEATURE_ENTRY(202110L, __cpp_lib_byteswap)
    COMPILER_FEATURE_ENTRY(202302L, __cpp_lib_common_reference)
    COMPILER_FEATURE_ENTRY(202302L, __cpp_lib_common_reference_wrapper)
    COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_concepts)
    COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_constexpr_bitset)
    COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_constexpr_charconv)
    COMPILER_FEATURE_ENTRY(202202L, __cpp_lib_constexpr_cmath)
    COMPILER_FEATURE_ENTRY(202202L, __cpp_lib_constexpr_memory)
    COMPILER_FEATURE_ENTRY(202106L, __cpp_lib_constexpr_typeinfo)
    COMPILER_FEATURE_ENTRY(202202L, __cpp_lib_containers_ranges)
    COMPILER_FEATURE_ENTRY(202211L, __cpp_lib_expected)
    COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_flat_map)
    COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_flat_set)
    COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_format)
    COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_format_ranges)
    COMPILER_FEATURE_ENTRY(202302L, __cpp_lib_formatters)
    COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_forward_like)
    COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_generator)
    COMPILER_FEATURE_ENTRY(202106L, __cpp_lib_invoke_r)
    COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_ios_noreplace)
    COMPILER_FEATURE_ENTRY(202302L, __cpp_lib_is_implicit_lifetime)
    COMPILER_FEATURE_ENTRY(202011L, __cpp_lib_is_scoped_enum)
    COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_mdspan)
    COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_modules)
    COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_move_iterator_concept)
    COMPILER_FEATURE_ENTRY(202110L, __cpp_lib_move_only_function)
    COMPILER_FEATURE_ENTRY(202110L, __cpp_lib_optional)
    COMPILER_FEATURE_ENTRY(202106L, __cpp_lib_out_ptr)
    COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_print)
    COMPILER_FEATURE_ENTRY(202302L, __cpp_lib_ranges)
    COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_ranges_as_const)
    COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_ranges_as_rvalue)
    COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_ranges_cartesian_product)
    COMPILER_FEATURE_ENTRY(202202L, __cpp_lib_ranges_chunk)
    COMPILER_FEATURE_ENTRY(202202L, __cpp_lib_ranges_chunk_by)
    COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_ranges_contains)
    COMPILER_FEATURE_ENTRY(202302L, __cpp_lib_ranges_enumerate)
    COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_ranges_find_last)
    COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_ranges_fold)
    COMPILER_FEATURE_ENTRY(202202L, __cpp_lib_ranges_iota)
    COMPILER_FEATURE_ENTRY(202202L, __cpp_lib_ranges_join_with)
    COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_ranges_repeat)
    COMPILER_FEATURE_ENTRY(202202L, __cpp_lib_ranges_slide)
    COMPILER_FEATURE_ENTRY(202106L, __cpp_lib_ranges_starts_ends_with)
    COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_ranges_stride)
    COMPILER_FEATURE_ENTRY(202202L, __cpp_lib_ranges_to_container)
    COMPILER_FEATURE_ENTRY(202110L, __cpp_lib_ranges_zip)
    COMPILER_FEATURE_ENTRY(202202L, __cpp_lib_reference_from_temporary)
    COMPILER_FEATURE_ENTRY(202202L, __cpp_lib_shift)
    COMPILER_FEATURE_ENTRY(202106L, __cpp_lib_spanstream)
    COMPILER_FEATURE_ENTRY(202011L, __cpp_lib_stacktrace)
    COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_start_lifetime_as)
    COMPILER_FEATURE_ENTRY(202011L, __cpp_lib_stdatomic_h)
    COMPILER_FEATURE_ENTRY(202011L, __cpp_lib_string_contains)
    COMPILER_FEATURE_ENTRY(202110L, __cpp_lib_string_resize_and_overwrite)
    COMPILER_FEATURE_ENTRY(202102L, __cpp_lib_to_underlying)
    COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_tuple_like)
    COMPILER_FEATURE_ENTRY(202202L, __cpp_lib_unreachable)
};
static constexpr CompilerFeature cxx26_core[] = {
    //< Продолжить заполнение
    COMPILER_FEATURE_ENTRY(202406L, __cpp_constexpr)
    COMPILER_FEATURE_ENTRY(202411L, __cpp_constexpr_exceptions)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_contracts)
    COMPILER_FEATURE_ENTRY(202403L, __cpp_deleted_function)
    COMPILER_FEATURE_ENTRY(202406L, __cpp_fold_expressions)
    COMPILER_FEATURE_ENTRY(202311L, __cpp_pack_indexing)
    COMPILER_FEATURE_ENTRY(202306L, __cpp_placeholder_variables)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_pp_embed)
    COMPILER_FEATURE_ENTRY(202306L, __cpp_static_assert)
    COMPILER_FEATURE_ENTRY(202411L, __cpp_structured_bindings)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_template_parameters)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_trivial_relocatability)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_trivial_union)
    COMPILER_FEATURE_ENTRY(202403L, __cpp_variadic_friend)
};
static constexpr CompilerFeature cxx26_lib[] = {
    //< Продолжить заполнение
    COMPILER_FEATURE_ENTRY(202403L, __cpp_lib_algorithm_default_value_type)
    COMPILER_FEATURE_ENTRY(202411L, __cpp_lib_aligned_accessor)
    COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_associative_heterogeneous_insertion)
    COMPILER_FEATURE_ENTRY(202403L, __cpp_lib_atomic_min_max)
    COMPILER_FEATURE_ENTRY(202411L, __cpp_lib_atomic_ref)
    COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_bind_back)
    COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_bind_front)
    COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_bitset)
    COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_chrono)
    COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_constexpr_algorithms)
    COMPILER_FEATURE_ENTRY(202411L, __cpp_lib_constexpr_atomic)
    COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_constexpr_cmath)
    COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_constexpr_complex)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_constexpr_deque)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_constexpr_exceptions)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_constexpr_flat_map)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_constexpr_flat_set)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_constexpr_forward_list)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_constexpr_inplace_vector)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_constexpr_list)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_constexpr_map)
    COMPILER_FEATURE_ENTRY(202406L, __cpp_lib_constexpr_new)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_constexpr_queue)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_constexpr_set)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_constexpr_stack)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_constexpr_unordered_map)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_constexpr_unordered_set)
    COMPILER_FEATURE_ENTRY(202411L, __cpp_lib_constrained_equality)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_contracts)
    COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_copyable_function)
    COMPILER_FEATURE_ENTRY(202403L, __cpp_lib_debugging)
    COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_format)
    COMPILER_FEATURE_ENTRY(202403L, __cpp_lib_format_path)
    COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_format_uchar)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_freestanding_algorithm)
    COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_freestanding_array)
    COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_freestanding_char_traits)
    COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_freestanding_charconv)
    COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_freestanding_cstdlib)
    COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_freestanding_cstring)
    COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_freestanding_cwchar)
    COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_freestanding_errc)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_freestanding_execution)
    COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_freestanding_expected)
    COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_freestanding_feature_test_macros)
    COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_freestanding_functional)
    COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_freestanding_iterator)
    COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_freestanding_mdspan)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_freestanding_memory)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_freestanding_numeric)
    COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_freestanding_operator_new)
    COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_freestanding_optional)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_freestanding_random)
    COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_freestanding_ranges)
    COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_freestanding_ratio)
    COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_freestanding_string_view)
    COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_freestanding_tuple)
    COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_freestanding_utility)
    COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_freestanding_variant)
    COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_fstream_native_handle)
    COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_function_ref)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_hardened_array)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_hardened_basic_string)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_hardened_basic_string_view)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_hardened_bitset)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_hardened_deque)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_hardened_expected)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_hardened_forward_list)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_hardened_inplace_vector)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_hardened_list)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_hardened_mdspan)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_hardened_optional)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_hardened_span)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_hardened_valarray)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_hardened_vector)
    COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_hazard_pointer)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_hive)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_indirect)
    COMPILER_FEATURE_ENTRY(202406L, __cpp_lib_inplace_vector)
    COMPILER_FEATURE_ENTRY(202411L, __cpp_lib_is_sufficiently_aligned)
    COMPILER_FEATURE_ENTRY(202406L, __cpp_lib_is_virtual_base_of)
    COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_is_within_lifetime)
    COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_linalg)
    COMPILER_FEATURE_ENTRY(202406L, __cpp_lib_mdspan)
    COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_not_fn)
    COMPILER_FEATURE_ENTRY(202406L, __cpp_lib_optional_range_support)
    COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_out_ptr)
    COMPILER_FEATURE_ENTRY(202406L, __cpp_lib_philox_engine)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_polymorphic)
    COMPILER_FEATURE_ENTRY(202403L, __cpp_lib_print)
    COMPILER_FEATURE_ENTRY(202406L, __cpp_lib_ranges)
    COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_ranges_as_const)
    COMPILER_FEATURE_ENTRY(202411L, __cpp_lib_ranges_cache_latest)
    COMPILER_FEATURE_ENTRY(202403L, __cpp_lib_ranges_concat)
    COMPILER_FEATURE_ENTRY(202403L, __cpp_lib_ranges_generate_random)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_ranges_reserve_hint)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_ranges_to_input)
    COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_ratio)
    COMPILER_FEATURE_ENTRY(202411L, __cpp_lib_raw_memory_algorithms)
    COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_rcu)
    COMPILER_FEATURE_ENTRY(202403L, __cpp_lib_reference_wrapper)
    COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_saturation_arithmetic)
    COMPILER_FEATURE_ENTRY(202406L, __cpp_lib_senders)
    COMPILER_FEATURE_ENTRY(202411L, __cpp_lib_simd)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_simd_complex)
    COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_smart_ptr_owner_equality)
    COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_span)
    COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_span_initializer_list)
    COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_sstream_from_string_view)
    COMPILER_FEATURE_ENTRY(202403L, __cpp_lib_string_view)
    COMPILER_FEATURE_ENTRY(202403L, __cpp_lib_submdspan)
    COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_text_encoding)
    COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_to_chars)
    COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_to_string)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_trivially_relocatable)
    COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_tuple_like)
    COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_variant)
};
static constexpr CompilerFeature cxx29_core[] = {
    //< Продолжить заполнение
    COMPILER_FEATURE_ENTRY(202604L, __cpp_core_TODO)
};
static constexpr CompilerFeature cxx29_lib[] = {
    //< Продолжить заполнение
    COMPILER_FEATURE_ENTRY(202604L, __cpp_lib_TODO)
};
static constexpr CompilerFeature attributes[] = {
    COMPILER_ATTRIBUTE(202207L, assume)
    COMPILER_ATTRIBUTE(200809L, carries_dependency)
    COMPILER_ATTRIBUTE(201309L, deprecated)
    COMPILER_ATTRIBUTE(201603L, fallthrough)
    COMPILER_ATTRIBUTE(202403L, indeterminate)
    COMPILER_ATTRIBUTE(201803L, likely)
    COMPILER_ATTRIBUTE(201603L, maybe_unused)
    COMPILER_ATTRIBUTE(201803L, no_unique_address)
    COMPILER_ATTRIBUTE(201907L, nodiscard)
    COMPILER_ATTRIBUTE(200809L, noreturn)
    COMPILER_ATTRIBUTE(201803L, unlikely)
};
inline void show_compiler_specific_info()
{
    std::printf("ДРУГИЕ МАКРОСЫ:\n");
    for (auto co : compiler)
        if (std::strcmp(co.первый, co.second))
            std::printf("%*s %s\n", -print.longest_macro_name, co.первый, co.second);
}
inline void print_compiler_feature(const CompilerFeature& x)
{
    if (not ((print.supported_features and x.возможно()) or
            (print.unsupported_features and not x.возможно())))
        return;
    auto print_year_month = [](long n)
    {
        return std::printf("%ld%s%02ld",
            n / 100, print.separate_year_month ? "-" : "", n % 100);
    };
    std::printf("%*s ", -print.longest_macro_name, x.name());
    x.возможно() ? print_year_month(x.data()) :
                    std::printf("------%s", print.separate_year_month ? "-" : "");
    if (print.standard_values)
        std::printf("  %c  ", (x.поддерживаемый() ? (x.data() > x.std() ? '>' : '=') : '<')),
            print_year_month(x.std());
    std::puts("");
}
template<class Container>
inline void show(char const* const title, Container const& co)
{
    if (print.заголовки)
    {
        std::printf("%-s (", title);
        if (print.счетчики)
        {
            std::printf("%zd/", std::count_if(std::begin(co), std::end(co),
                [](CompilerFeature x)
                {
                    return x.поддерживаемый();
                }));
        }
        std::printf("%td)\n", std::distance(std::begin(co), std::end(co)));
    }
    if (print.sort_by_date)
    {
        std::vector<CompilerFeature> v(std::begin(co), std::end(co));
        std::stable_sort(v.begin(), v.end(),
            [](CompilerFeature const& lhs, CompilerFeature const& rhs)
            {
                return lhs.data() < rhs.data();
            });
        std::for_each(v.cbegin(), v.cend(), print_compiler_feature);
    }
    else
        std::for_each(std::begin(co), std::end(co), print_compiler_feature);
    std::puts("");
}
inline void show_latest()
{
    auto latest_rev = []() -> int
    {
        return print.cxx29 ? 29 : print.cxx26 ? 26 : print.cxx23 ? 23 : print.cxx20 ? 20 :
               print.cxx17 ? 17 : print.cxx14 ? 14 : print.cxx11 ? 11 : 98;
    };
    std::vector<CompilerFeature> latest;
    auto add = [&latest](CompilerFeature x)
    {
        auto i = std::lower_bound(latest.begin(), latest.end(), x);
        if (i == latest.end() or not (*i == x))
            latest.insert(i, x);
        else if (i->data() < x.data())
            i->data(x.data());
    };
    char text[64];
    latest.reserve(512); // макросы max
    if (print.core_features)
    {   // сохранять обратный порядок вставки ревизий!
        if (print.cxx29) std::for_each(std::begin(cxx29_core), std::end(cxx29_core), add);
        if (print.cxx26) std::for_each(std::begin(cxx26_core), std::end(cxx26_core), add);
        if (print.cxx23) std::for_each(std::begin(cxx23_core), std::end(cxx23_core), add);
        if (print.cxx20) std::for_each(std::begin(cxx20_core), std::end(cxx20_core), add);
        if (print.cxx17) std::for_each(std::begin(cxx17_core), std::end(cxx17_core), add);
        if (print.cxx14) std::for_each(std::begin(cxx14_core), std::end(cxx14_core), add);
        if (print.cxx11) std::for_each(std::begin(cxx11_core), std::end(cxx11_core), add);
        if (print.cxx98) std::for_each(std::begin(cxx98_core), std::end(cxx98_core), add);
        std::snprintf(text, sizeof text, "ВСЕ ОСНОВНЫЕ МАКРОСЫ ДО C++%02i", latest_rev());
        show(text, latest);
    }
    latest.clear();
    if (print.lib_features)
    {   // сохранять обратный порядок вставки ревизий!
        if (print.cxx29) std::for_each(std::begin(cxx29_lib), std::end(cxx29_lib), add);
        if (print.cxx26) std::for_each(std::begin(cxx26_lib), std::end(cxx26_lib), add);
        if (print.cxx23) std::for_each(std::begin(cxx23_lib), std::end(cxx23_lib), add);
        if (print.cxx20) std::for_each(std::begin(cxx20_lib), std::end(cxx20_lib), add);
        if (print.cxx17) std::for_each(std::begin(cxx17_lib), std::end(cxx17_lib), add);
        if (print.cxx14) std::for_each(std::begin(cxx14_lib), std::end(cxx14_lib), add);
        std::snprintf(text, sizeof text, "ВСЕ МАКРОСЫ БИБЛИОТЕК ДО C++%02i", latest_rev());
        show(text, latest);
    }
}
int main()
{
    if (print.separated_revisions)
    {
        if (print.cxx98 and print.core_features) show("C++98 CORE", cxx98_core);
        if (print.cxx11 and print.core_features) show("C++11 CORE", cxx11_core);
        if (print.cxx14 and print.core_features) show("C++14 CORE", cxx14_core);
        if (print.cxx14 and print.lib_features ) show("Библиотека C++14" , cxx14_lib);
        if (print.cxx17 and print.core_features) show("C++17 CORE", cxx17_core);
        if (print.cxx17 and print.lib_features ) show("Библиотека C++17" , cxx17_lib);
        if (print.cxx20 and print.core_features) show("C++20 CORE", cxx20_core);
        if (print.cxx20 and print.lib_features ) show("Библиотека C++20" , cxx20_lib);
        if (print.cxx23 and print.core_features) show("C++23 CORE", cxx23_core);
        if (print.cxx23 and print.lib_features ) show("Библиотека C++23" , cxx23_lib);
        if (print.cxx26 and print.core_features) show("C++26 CORE", cxx26_core);
        if (print.cxx26 and print.lib_features ) show("C++26 LIB" , cxx26_lib);
        if (print.cxx29 and print.core_features) show("C++29 CORE", cxx29_core);
        if (print.cxx29 and print.lib_features ) show("C++29 LIB" , cxx29_lib);
    }
    if (print.latest_revisions) show_latest();
    if (print.атрибуты) show("АТРИБУТЫ", attributes);
    if (print.compiler_specific) show_compiler_specific_info();
}

Возможный вывод:

C++11 ЯДРО (20/20)
__cpp_alias_templates                         2007-04  =  2007-04
__cpp_attributes                              2008-09  =  2008-09
__cpp_constexpr                               2022-11  >  2007-04
__cpp_constexpr_in_decltype                   2017-11  =  2017-11
... truncated ...
C++14 ЯДРО (9/9)
__cpp_aggregate_nsdmi                         2013-04  =  2013-04
__cpp_binary_literals                         2013-04  =  2013-04
__cpp_constexpr                               2022-11  >  2013-04
... truncated ...
C++14 БИБЛИОТЕКА (20/20)
__cpp_lib_chrono_udls                         2013-04  =  2013-04
__cpp_lib_complex_udls                        2013-09  =  2013-09
__cpp_lib_exchange_function                   2013-04  =  2013-04
... truncated ...
... truncated ...
C++23 БИБЛИОТЕКА (43/64)
__cpp_lib_adaptor_iterator_pair_constructor   2021-06  =  2021-06
__cpp_lib_algorithm_iterator_requirements     -------  <  2022-07
__cpp_lib_allocate_at_least                   -------  <  2023-02
__cpp_lib_associative_heterogeneous_erasure   -------  <  2021-10
__cpp_lib_barrier                             2019-07  <  2023-02
... truncated ...
ВСЕ МАКРОСЫ ЯДРА ДО C++26 (60/76)
__cpp_aggregate_bases                         2016-03  =  2016-03
__cpp_aggregate_nsdmi                         2013-04  =  2013-04
__cpp_aggregate_paren_init                    2019-02  =  2019-02
__cpp_alias_templates                         2007-04  =  2007-04
... truncated ...
ВСЕ МАКРОСЫ БИБЛИОТЕКИ ДО C++26 (158/282)
__cpp_lib_adaptor_iterator_pair_constructor   2021-06  =  2021-06
__cpp_lib_addressof_constexpr                 2016-03  =  2016-03
__cpp_lib_algorithm_iterator_requirements     -------  <  2022-07
__cpp_lib_allocate_at_least                   -------  <  2023-02
__cpp_lib_allocator_traits_is_always_equal    2014-11  =  2014-11
... truncated ...
АТРИБУТЫ (9/11)
assume                                        2022-07  =  2022-07
carries_dependency                            -------  <  2008-09
deprecated                                    2013-09  =  2013-09
fallthrough                                   2016-03  =  2016-03
... truncated ...
ДРУГИЕ МАКРОСЫ:
__cplusplus                                   202302L
__GNUG__                                      14
__GNUC_MINOR__                                2
__GNUC_PATCHLEVEL__                           0
__STDCPP_FLOAT16_T__                          1
__STDCPP_FLOAT32_T__                          1
... truncated ...

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применяется к Поведение в опубликованной версии Корректное поведение
P2552R3 C++20 __has_cpp_attribute должен раскрываться в ненулевое значение для стандартных атрибутов может раскрываться в 0

Смотрите также

Макросы тестирования возможностей библиотеки (C++20) определены в заголовке <version>
Предопределенные макросы
Указатель макросов

Внешние ссылки

1. Официальный документ по рекомендациям тестирования функций
2. Исходный код для вывода функций компилятора