Spec-Zone.ru › C++

Тестирование возможностей (начиная с C++20)

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

Атрибуты

__has_cpp_attribute( токен атрибута )

Проверяет поддержку атрибута, имя которого задаётся токеном атрибута (после раскрытия макросов).

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

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

__has_cpp_attribute можно раскрывать в выражении

  1. if и
  2. elif.

Считается определённым макросом для

  1. ifdef,
  2. ifndef,
  3. elifdef,
  4. elifndef(начиная с C++23) и defined, но не может использоваться где-либо ещё.
токен атрибута Атрибут Значение Стандарт Документ(ы)
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

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

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

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

Имя макроса Возможность Значение Стандарт Документ(ы)
__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 Преобразование выражения в prvalue (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 исправление совместимости и переносимости (разрешена инициализация массивов char (unsigned) из строковых литералов UTF-8) 202207L (C++23)
(DR20)
P2513R4
__cpp_concepts Концепты 201907L (C++20) P0734R0
P1084R2
P1452R2
Условно тривиальные специальные функции-члены 202002L P0848R3
P2493R0
Условные спецификаторы noexcept в составных требованиях 202606L (C++29) P3822R2
__cpp_conditional_explicit Условный спецификатор explicit 201806L (C++20) P0892R2
__cpp_consteval Немедленно вычисляемые функции 201811L (C++20) P1073R3
Распространение consteval вверх по цепочке 202211L (C++23)
(DR20)
P2564R3
Значения, доступные только в consteval 202606L (C++29)
(DR26)
P4101R1
__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
Преобразование constexpr из void*: на пути к стиранию типа constexpr 202306L (C++26) P2738R1
Размещение new constexpr placement new 202406L P2747R2
__cpp_constexpr_dynamic_alloc Операции с динамической продолжительностью хранения в функциях constexpr 201907L (C++20) P0784R7
__cpp_constexpr_exceptions Исключения constexpr 202411L (C++26) P3068R6
__cpp_constexpr_in_decltype Создание определений функций и переменных, когда они необходимы для константного вычисления 201711L (C++20)
(DR11)
P0859R0
__cpp_constexpr_virtual_inheritance Виртуальное наследование constexpr 202506L (C++26) P3533R2
__cpp_constinit constinit 201907L (C++20) P1143R2
__cpp_contracts Контракты 202502L (C++26) P2900R14
Контракты для виртуальных функций 202606L (C++29) P3097R3
__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
Инициализаторы с указанием имени для базовых классов 202606L (C++29) P2287R6
__cpp_enumerator_attributes Атрибуты для перечислителей 201411L (C++17) N4266
__cpp_expansion_statements Операторы раскрытия (template for) 202506L (C++26) P1306R5
__cpp_explicit_this_parameter Явный параметр объекта 202110L (C++23) P0847R7
__cpp_fold_expressions Свёрточные выражения 201603L (C++17) N4295
P0036R0
Упорядочивание ограничений с участием свёрточных выражений 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
Отмена взаимоисключения функций возврата объекта promise сопрограммы сопрограммы 202606L (C++29)
(DR20)
P3950R1
__cpp_impl_destroying_delete Уничтожающий operator delete (поддержка компилятора) 201806L (C++20) P0722R3
__cpp_impl_reflection Рефлексия 202506L (C++26) P2996R13
P3096R12
P3293R3
P3394R4
P3795R2
__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
Новая спецификация для наследуемых конструкторов 201511L (C++17)
(DR11)
P0136R1
__cpp_init_captures Начальное захватывание в лямбде 201304L (C++14) N3648
Разрешено раскрытие пакета при начальном захватывании в лямбде 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
Индексирование пакетов для шаблонов 202606L (C++29) P3670R4
__cpp_placeholder_variables Удобная безымянная заглушка 202306L (C++26) P2169R4
__cpp_pp_embed
  1. embed
202502L (C++26) P1967R14
#embed параметр смещения 202606L (C++29) P3540R3
__cpp_range_based_for Цикл for на основе диапазона 200907L (C++11) N2930
Цикл for на основе диапазона с различными типами begin/end 201603L (C++17) P0184R0
Продление времени жизни в цикле на основе диапазона for 202211L (C++23) P2644R1
P2718R0
CWG2659
__cpp_raw_strings Сырые строковые литералы 200710L (C++11) N2442
__cpp_ref_qualifiers Квалификаторы ref 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
Объявление структурной привязки в качестве условия 202406L P0963R3
Структурные привязки могут вводить пакет 202411L P1061R10
__cpp_template_parameters Параметры шаблона для концептов и шаблонов переменных 202502L (C++26) P2841R7
__cpp_template_template_args Сопоставление аргументов шаблона-шаблона 201611L (C++17) P0522R0
__cpp_threadsafe_static_init Динамическая инициализация и уничтожение с поддержкой многопоточности 200806L (C++11) N2660
__cpp_trivial_union Тривиальные объединения 202603L (C++26) P3074R7
P3726R2
__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 Вариативные объявления friend 202403L (C++26) P2893R3
__cpp_variadic_templates Вариативные шаблоны 200704L (C++11) N2242
__cpp_variadic_using Раскрытие пакетов в объявлениях using 201611L (C++17) P0195R2
Общее количество макросов: 78

Возможности библиотеки

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

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

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

Имя макроса Возможность Значение Стандарт Документ(ы)
__cpp_lib_adaptor_iterator_pair_constructor Конструкторы по паре итераторов для std::stack и std::queue 202106L (C++23) P1425R4
__cpp_lib_addressof_constexpr Константное выражение для std::addressof 201603L (C++17) LWG2296
__cpp_lib_algorithm_default_value_type Поддержка инициализации списком для алгоритмов 202403L 202603L (C++26) P2248R8
P3217R0
P3787R2
__cpp_lib_algorithm_iterator_requirements Итераторы диапазонов в качестве входных данных для обычных алгоритмов 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
std::apply: std::apply_result, std::is_applicable и std::is_nothrow_applicable 202506L (C++26) P1317R2
__cpp_lib_array_constexpr Константное выражение для std::reverse_iterator, std::move_iterator, std::array и доступа к диапазонам 201603L (C++17) P0031R0
ConstexprIterator; сравнение в константных выражениях для std::array; прочие элементы для константных выражений (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 Константное выражение std::atomic<T>::is_always_lock_free 201603L (C++17) P0152R1
__cpp_lib_atomic_lock_free_type_aliases Атомарные целочисленные типы без блокировок (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
Атомарные минимум/максимум для чисел с плавающей точкой 202506L P3008R6
__cpp_lib_atomic_reductions Операции атомарной редукции 202506L (C++26) P3111R8
__cpp_lib_atomic_ref std::atomic_ref 201806L (C++20) P0019R8
std::atomic_ref::address() 202603L (C++26) P2835R7
P3936R1
__cpp_lib_atomic_shared_ptr std::atomic<std::shared_ptr> 201711L (C++20) P0718R2
__cpp_lib_atomic_value_initialization Исправление инициализации atomic (по умолчанию 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
<bit>: битовые перестановки, std::shl и std::shr 202607L (C++29) P3104R6
P3793R2
__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
Константное выражение для всех функций-членов 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_constant_wrapper std::constant_wrapper 202603L (C++26) P2781R9
P3978R3
Отмена поддержки строковых литералов в std::constant_wrapper 202606L (C++29)
(DR26)
P4206R0
__cpp_lib_constexpr_algorithms Константные выражения для алгоритмов 201806L (C++20) P0202R3
P0879R0
LWG3256
LWG3792
Стабильная сортировка в константных выражениях 202306L (C++26) P2562R1
__cpp_lib_constexpr_atomic Константные выражения для std::atomic и std::atomic_ref 202411L (C++26) P3309R3
__cpp_lib_constexpr_bitset Более широкая поддержка 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 Возможность constexpr для 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_format Форматирование текста в constexpr 202511L (C++26) P3391R2
__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
constexpr для std::shared_ptr и связанных средств 202506L (C++26) P3037R6
__cpp_lib_constexpr_new constexpr для размещающего new 202406L (C++26) P2747R2
__cpp_lib_constexpr_numeric constexpr для алгоритмов из <numeric> 201911L (C++20) P1645R1
__cpp_lib_constexpr_queue constexpr для std::queue и std::priority_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::char_traits 201811L (C++20) P1032R1
constexpr для std::string 201907L 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 constexpr для 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 С учетом диапазонов конструирование и вставка для контейнеров и строк 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_counting_scope Асинхронные области: создание областей для параллельного выполнения без последовательного порядка 202506L (C++26) P3149R11
P3815R1
__cpp_lib_debugging <debugging>: Поддержка отладки 202311L (C++26) P2546R5
Заменяемая std::is_debugger_present 202403L P2810R4
__cpp_lib_define_static std::define_static_object, std::define_static_array, std::define_static_string 202506L (C++26) P3491R3
__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_exception_ptr_cast std::exception_ptr_cast() 202603L (C++26) P2927R3
P3748R0
P3981R2
__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
std::expected::has_error() 202606L (C++29) P3798R1
__cpp_lib_filesystem Библиотека файловой системы 201703L (C++17) P0218R1
P0219R1
P0392R0
P0317R1
__cpp_lib_flat_map std::flat_map и std::flat_multimap 202207L (C++23) P0429R9
Исправления для std::flat_map и std::flat_multimap 202511L (C++26) P3567R2
__cpp_lib_flat_set std::flat_set и std::flat_multiset 202207L (C++23) P1222R4
LWG3751
Исправления для std::flat_set и std::flat_multiset 202511L (C++26) P3567R2
__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; уточнение обработки кодировок при локализованном форматировании типов chrono 202207L (C++23) P2419R2
P2508R1
Форматирование указателей 202304L (C++26) P2510R3
Проверка типов аргументов формата 202305L P2757R3
Элемент visit 202306L P2637R3
Строки формата времени выполнения 202311L P2918R2
Переименование std::runtime_format в std::dynamic_format 202603L P2918R2
__cpp_lib_format_path Форматирование std::filesystem::path 202403L (C++26) P2845R8
std::filesystem::path::display_string() и std::filesystem::path::native_encoded_string() 202506L P2319R5
__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 Автономная реализация 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
Автономная реализация std::optional<T&> 202506L P3836R2
__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_hardware_interference_size std::hardware_{constructive, destructive}_interference_size 201703L (C++17) P0154R1
__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
Пакеты указателей опасности 202606L (C++29) P3428R4
__cpp_lib_hive <hive>: контейнер на основе блоков, повторно использующий ячейки памяти удалённых элементов 202502L (C++26) P0447R28
__cpp_lib_hypot Перегрузка 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) P3019R14
__cpp_lib_initializer_list Устранение несоответствий в begin/end для std::initializer_list 202511L (C++26)
(DR11)
P3016R6
__cpp_lib_inplace_vector std::inplace_vector: динамически изменяемый вектор с фиксированной ёмкостью 202406L (C++26) P0843R14
Улучшенные типы возвращаемых значений. Удалена функция-член try_append_range 202603L P3981R2
P4022R0
__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
Обеспечение возможности использования std::integer_sequence в структурированных привязках и операторах развёртки 202511L (C++26) P1789R3
__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 Поддержка эксклюзивного режима для файловых потоков 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_nothrow_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_structural std::is_structural: свойство типа для определения структурных типов 202603L (C++26) P3856R8
__cpp_lib_is_sufficiently_aligned std::is_sufficiently_aligned: проверяет предусловие выравнивания указателя 202411L (C++26) P2897R7
__cpp_lib_is_swappable Свойства возможности обмена (без выбрасывания исключений) 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
Расширение std::is_within_lifetime 202603L P3450R1
__cpp_lib_jthread Токен остановки и поток с автоматическим присоединением 201911L (C++20) P0660R10
P1869R1
__cpp_lib_latch std::latch 201907L (C++20) P1135R6
__cpp_lib_launder Проблема CWG 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_lookup Улучшенная функция поиска для контейнеров map 202606L (C++29) P3091R6
__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_mdspan_copy std::mdspan операции копирования и заполнения 202606L (C++29) P3242R4
__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 Перемещение элементов между map и set (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 Нулевые LegacyForwardIterators 201304L (C++14) N3644
__cpp_lib_observable_checkpoint Поддержка наблюдаемых контрольных точек в библиотеке 202506L (C++26) P1494R5
P3641R0
__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
std::optional<T&> 202506L (C++26) P2988R12
__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
Для freestanding-реализаций: std::out_ptr, std::inout_ptr 202311L (C++26) P2833R2
__cpp_lib_parallel_algorithm Параллельные алгоритмы 201603L (C++17) P0024R2
Параллельные алгоритмы для диапазонов 202506L (C++26) P3179R9
P3709R2
__cpp_lib_parallel_scheduler Параллельный планировщик 202506L (C++26) P2079R10
P3804R2
__cpp_lib_philox_engine std::philox_engine: генератор случайных чисел на основе счётчика 202406L (C++26) P2075R6
__cpp_lib_pointer_tag_pair Тегирование указателей 202606L (C++29) P3125R6
__cpp_lib_polymorphic std::polymorphic 202502L (C++26) P3019R14
__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
std::print больше типов быстрее и с меньшим расходом памяти 202406L P3235R3
__cpp_lib_quoted_string_io std::quoted 201304L (C++14) N3654
__cpp_lib_ranges Библиотека диапазонов и алгоритмы с ограничениями 201911L (C++20) P0896R4
P1035R7
P1716R3
Представления, не являющиеся инициализируемыми по умолчанию 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_input std::ranges::as_input_view 202502L (C++26) P3137R3
P3828R1
__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_filter Расширения представления фильтра для более безопасного использования 202603L (C++26)
(DR20)
P3725R3
__cpp_lib_ranges_find_last std::ranges::find_last, std::ranges::find_last_if, and 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_indices std::views::indices 202506L (C++26) P3060R3
__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 and 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_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) P3369R0
P3508R0
__cpp_lib_rcu <rcu>: обновление чтением-копированием (RCU) 202306L (C++26) P2545R4
__cpp_lib_reference_from_temporary std::reference_constructs_from_temporary and std::reference_converts_from_temporary 202202L (C++23) P2255R2
__cpp_lib_reference_wrapper Операции сравнения для std::reference_wrapper 202403L (C++26) P2944R3
__cpp_lib_reflection <meta>: рефлексия 202506L (C++26) P2996R13
P3394R4
P3293R3
P3096R12
P3560R2
P3795R2
P4156R0
__cpp_lib_remove_cvref std::remove_cvref 201711L (C++20) P0550R2
__cpp_lib_replaceable_contract_violation_handler Определяемая реализацией поддержка заменяемого обработчика нарушения контрактов 202603L (C++26) P3886R0
__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
Переименование функций арифметики с насыщением 202603L (C++26) P4052R0
__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
std::execution: дополнительные расширения 202506L P3388R3
P3396R1
P3433R1
P3481R5
P3570R2
P3682R0
P3887R1
__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 and std::shift_right 201806L (C++20) P0769R2
std::ranges::shift_left and std::ranges::shift_right 202202L (C++23) P2440R1
__cpp_lib_simd <simd>: типы с параллелизмом по данным 202411L (C++26) P1928R15
std::simd::iota 202606L (C++29) P3319R6
__cpp_lib_simd_bitops <simd>: битовые перестановки, std::simd::shl и std::simd::shr 202607L (C++29) P3772R2
P3793R2
__cpp_lib_simd_complex Поддержка чередующихся значений std::complex в std::simd 202502L (C++26) P2663R7
__cpp_lib_simd_permutations Операции перестановки SIMD 202506L (C++26) P2664R11
__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 в категорию freestanding 202311L (C++26) P2821R5
P2833R2
__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 std::start_lifetime 202603L (C++26) P3726R2
__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 Заголовок совместимости <stdatomic.h> для атомарных операций C 202011L (C++23) P0943R6
__cpp_lib_stdbit_h Заголовок совместимости <stdbit.h> для побитовых операций C 202603L (C++26) P3370R1
__cpp_lib_stdckdint_h Заголовок совместимости <stdckdint.h> для проверяемых целочисленных операций C 202603L (C++26) P3370R1
__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_subview std::string::subview() и std::string_view::subview() 202506L (C++26) P3044R2
__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_task Типы задач сопрограмм 202506L (C++26) P3552R3
P3980R1
P3927R2
P3941R4
P4151R1
__cpp_lib_text_encoding std::text_encoding 202306L (C++26) P1885R12
__cpp_lib_thread_attributes Атрибуты потоков 202606L (C++29) P2019R9
__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
Исправление представления чисел с плавающей точкой по умолчанию в std::to_chars 202606L (C++29) P3505R4
__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 Шаблоны псевдонимов для трейтов преобразования 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_tuple_element_t std::tuple_element_t 201402L (C++14) N3887
__cpp_lib_tuple_like Совместимость между std::tuple и объектами, подобными кортежам (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_order Стандартизированный порядок типов constexpr 202506L (C++26) P2830R10
P3778R0
P4140R0
__cpp_lib_type_trait_variable_templates Переменные шаблоны трейтов типов (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_valarray Устранение несоответствий в begin/end для std::valarray 202511L (C++26)
(DR11)
P3016R6
__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_view_interface view_interface::at() 202606L (C++29) P3052R2
__cpp_lib_void_t std::void_t 201411L (C++17) N3911
Общее количество макросов: 294

Пример

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

#ifdef __has_include                           // Check if __has_include is present
#  if __has_include(<optional>)                // Check for a standard library
#    include <optional>
#  elif __has_include(<experimental/optional>) // Check for an experimental version
#    include <experimental/optional>
#  elif __has_include(<boost/optional.hpp>)    // Try with an external library
#    include <boost/optional.hpp>
#  else                                        // Not found at all
#     error "Missing <optional>"
#  endif
#endif

#ifdef __has_cpp_attribute                      // Check if __has_cpp_attribute is present
#  if __has_cpp_attribute(deprecated)           // Check for an attribute
#    define DEPRECATED(msg) [[deprecated(msg)]]
#  endif
#endif
#ifndef DEPRECATED
#    define DEPRECATED(msg)
#endif

DEPRECATED("foo() has been deprecated") void foo();

#if __cpp_constexpr >= 201304                // Check for a specific version of a feature
#  define CONSTEXPR constexpr
#else
#  define CONSTEXPR inline
#endif

CONSTEXPR int bar(unsigned i)
{
#if __cpp_binary_literals                    // Check for the presence of a feature
    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 change_these_options_to_select_what_will_be_printed
{
    constexpr static int longest_macro_name { 50 };
    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                = 1;
    constexpr static bool cxx32                = 0;
} print;

#if __cplusplus < 201100
#  error "C++11 or better is required"
#endif

#include <algorithm>
#include <cstdio>
#include <cstring>
#include <utility>
#include <vector>

#ifdef __has_include
# if __has_include(<version>)
#   include <version>
# endif
#endif

// Expect a string that starts with 6-decimal-digits or with '_' (if unsupported)
#define COMPILER_VALUE_INT(n) #n [0] == '_' or #n [0] == '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; }
};

static /*constexpr*/ std::pair<const char*, const char*> compiler[] = {
    COMPILER_SPECIFIC_ENTRY(__cplusplus) //< not compiler specific, but useful :)
    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__)
    // Add your favorite compiler specific macros. Undefined ones will not be printed.
};

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(202506L, __cpp_constexpr_virtual_inheritance)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_contracts)
    COMPILER_FEATURE_ENTRY(202403L, __cpp_deleted_function)
    COMPILER_FEATURE_ENTRY(202506L, __cpp_expansion_statements)
    COMPILER_FEATURE_ENTRY(202406L, __cpp_fold_expressions)
    COMPILER_FEATURE_ENTRY(202603L, __cpp_impl_reflection)
    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(202603L, __cpp_trivial_union)
    COMPILER_FEATURE_ENTRY(202403L, __cpp_variadic_friend)
};
static constexpr CompilerFeature cxx26_lib[] = {
    COMPILER_FEATURE_ENTRY(202603L, __cpp_lib_algorithm_default_value_type)
    COMPILER_FEATURE_ENTRY(202411L, __cpp_lib_aligned_accessor)
    COMPILER_FEATURE_ENTRY(202506L, __cpp_lib_apply)
    COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_associative_heterogeneous_insertion)
    COMPILER_FEATURE_ENTRY(202506L, __cpp_lib_atomic_min_max)
    COMPILER_FEATURE_ENTRY(202506L, __cpp_lib_atomic_reductions)
    COMPILER_FEATURE_ENTRY(202603L, __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(202603L, __cpp_lib_constant_wrapper)
    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(202511L, __cpp_lib_constexpr_format)
    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(202506L, __cpp_lib_constexpr_memory)
    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(202506L, __cpp_lib_counting_scope)
    COMPILER_FEATURE_ENTRY(202403L, __cpp_lib_debugging)
    COMPILER_FEATURE_ENTRY(202506L, __cpp_lib_define_static)
    COMPILER_FEATURE_ENTRY(202603L, __cpp_lib_exception_ptr_cast)
    COMPILER_FEATURE_ENTRY(202511L, __cpp_lib_flat_map)
    COMPILER_FEATURE_ENTRY(202511L, __cpp_lib_flat_set)
    COMPILER_FEATURE_ENTRY(202603L, __cpp_lib_format)
    COMPILER_FEATURE_ENTRY(202506L, __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(202506L, __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(202604L, __cpp_lib_function_ref)
    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(202511L, __cpp_lib_initializer_list)
    COMPILER_FEATURE_ENTRY(202603L, __cpp_lib_inplace_vector)
    COMPILER_FEATURE_ENTRY(202511L, __cpp_lib_integer_sequence)
    COMPILER_FEATURE_ENTRY(202603L, __cpp_lib_is_structural)
    COMPILER_FEATURE_ENTRY(202411L, __cpp_lib_is_sufficiently_aligned)
    COMPILER_FEATURE_ENTRY(202406L, __cpp_lib_is_virtual_base_of)
    COMPILER_FEATURE_ENTRY(202603L, __cpp_lib_is_within_lifetime)
    COMPILER_FEATURE_ENTRY(202511L, __cpp_lib_linalg)
    COMPILER_FEATURE_ENTRY(202406L, __cpp_lib_mdspan)
    COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_not_fn)
    COMPILER_FEATURE_ENTRY(202506L, __cpp_lib_observable_checkpoint)
    COMPILER_FEATURE_ENTRY(202506L, __cpp_lib_optional)
    COMPILER_FEATURE_ENTRY(202406L, __cpp_lib_optional_range_support)
    COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_out_ptr)
    COMPILER_FEATURE_ENTRY(202506L, __cpp_lib_parallel_algorithm)
    COMPILER_FEATURE_ENTRY(202506L, __cpp_lib_parallel_scheduler)
    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(202502L, __cpp_lib_ranges_as_input)
    COMPILER_FEATURE_ENTRY(202411L, __cpp_lib_ranges_cache_latest)
    COMPILER_FEATURE_ENTRY(202403L, __cpp_lib_ranges_concat)
    COMPILER_FEATURE_ENTRY(202603L, __cpp_lib_ranges_filter)
    COMPILER_FEATURE_ENTRY(202403L, __cpp_lib_ranges_generate_random)
    COMPILER_FEATURE_ENTRY(202506L, __cpp_lib_ranges_indices)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_ranges_reserve_hint)
    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(202603L, __cpp_lib_reflection)
    COMPILER_FEATURE_ENTRY(202603L, __cpp_lib_replaceable_contract_violation_handler)
    COMPILER_FEATURE_ENTRY(202603L, __cpp_lib_saturation_arithmetic)
    COMPILER_FEATURE_ENTRY(202506L, __cpp_lib_senders)
    COMPILER_FEATURE_ENTRY(202603L, __cpp_lib_simd)
    COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_simd_complex)
    COMPILER_FEATURE_ENTRY(202506L, __cpp_lib_simd_permutations)
    COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_smart_ptr_owner_equality)
    COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_span)
    COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_sstream_from_string_view)
    COMPILER_FEATURE_ENTRY(202603L, __cpp_lib_start_lifetime)
    COMPILER_FEATURE_ENTRY(202603L, __cpp_lib_stdbit_h)
    COMPILER_FEATURE_ENTRY(202603L, __cpp_lib_stdckdint_h)
    COMPILER_FEATURE_ENTRY(202506L, __cpp_lib_string_subview)
    COMPILER_FEATURE_ENTRY(202403L, __cpp_lib_string_view)
    COMPILER_FEATURE_ENTRY(202603L, __cpp_lib_submdspan)
    COMPILER_FEATURE_ENTRY(202506L, __cpp_lib_task)
    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(202311L, __cpp_lib_tuple_like)
    COMPILER_FEATURE_ENTRY(202506L, __cpp_lib_type_order)
    COMPILER_FEATURE_ENTRY(202511L, __cpp_lib_valarray)
    COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_variant)
};

static constexpr CompilerFeature cxx29_core[] = {
    //< Continue to Populate
    COMPILER_FEATURE_ENTRY(202606L, __cpp_concepts)
    COMPILER_FEATURE_ENTRY(202606L, __cpp_consteval)
    COMPILER_FEATURE_ENTRY(202606L, __cpp_contracts)
    COMPILER_FEATURE_ENTRY(202606L, __cpp_designated_initializers)
    COMPILER_FEATURE_ENTRY(202606L, __cpp_impl_coroutine)
    COMPILER_FEATURE_ENTRY(202606L, __cpp_pack_indexing)
    COMPILER_FEATURE_ENTRY(202606L, __cpp_pp_embed)
};
static constexpr CompilerFeature cxx29_lib[] = {
    //< Continue to Populate
    COMPILER_FEATURE_ENTRY(202607L, __cpp_lib_bitops)
    COMPILER_FEATURE_ENTRY(202606L, __cpp_lib_constant_wrapper)
    COMPILER_FEATURE_ENTRY(202606L, __cpp_lib_expected)
    COMPILER_FEATURE_ENTRY(202606L, __cpp_lib_hazard_pointer)
    COMPILER_FEATURE_ENTRY(202606L, __cpp_lib_map_lookup)
    COMPILER_FEATURE_ENTRY(202606L, __cpp_lib_mdspan_copy)
    COMPILER_FEATURE_ENTRY(202606L, __cpp_lib_pointer_tag_pair)
    COMPILER_FEATURE_ENTRY(202606L, __cpp_lib_simd)
    COMPILER_FEATURE_ENTRY(202607L, __cpp_lib_simd_bitops)
    COMPILER_FEATURE_ENTRY(202606L, __cpp_lib_thread_attributes)
    COMPILER_FEATURE_ENTRY(202606L, __cpp_lib_to_chars)
    COMPILER_FEATURE_ENTRY(202606L, __cpp_lib_view_interface)
};

static constexpr CompilerFeature cxx32_core[] = {
    //< Continue to Populate
    COMPILER_FEATURE_ENTRY(202906L, __cpp_core_TODO)
};
static constexpr CompilerFeature cxx32_lib[] = {
    //< Continue to Populate
    COMPILER_FEATURE_ENTRY(202906L, __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("Compiler specific macros:\n");
    for (auto co : compiler)
        if (std::strcmp(co.first, co.second))
            std::printf("%*s %s\n", -print.longest_macro_name, co.first, co.second);
}

inline void print_compiler_feature(const CompilerFeature& x)
{
    if (not ((print.supported_features and x.maybe()) or
            (print.unsupported_features and not x.maybe())))
        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.maybe() ? print_year_month(x.data()) :
                    std::printf("------%s", print.separate_year_month ? "-" : "");
    if (print.standard_values)
        std::printf("  %c  ", (x.supported() ? (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.titles)
    {
        std::printf("%-s (", title);
        if (print.counters)
        {
            std::printf("%zd/", std::count_if(std::begin(co), std::end(co),
                [](CompilerFeature x)
                {
                    return x.supported();
                }));
        }
        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("");
}

#define CXX(R) print.cxx##R ? R :
#define CORE(R) if (print.cxx##R) std::for_each( \
    std::begin(cxx##R##_core), std::end(cxx##R##_core), add);
#define LIB(R) if (print.cxx##R) std::for_each( \
    std::begin(cxx##R##_lib), std::end(cxx##R##_lib), add);
#define PCORE(R) if (print.cxx##R and print.core_features) \
    show("C++"#R " CORE", cxx##R##_core);
#define PLIB(R) if (print.cxx##R and print.lib_features ) \
    show("C++"#R " LIB" , cxx##R##_lib);

inline void show_latest()
{
    auto latest_rev = []() -> int
    {
        return CXX(32) CXX(29) CXX(26) CXX(23) CXX(20) CXX(17) CXX(14) CXX(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(1024); // max macros
    if (print.core_features)
    {   // preserve reverse revision insertion order!
        CORE(32) CORE(29) CORE(26) CORE(23) CORE(20) CORE(17) CORE(14) CORE(11) CORE(98)
        std::snprintf(text, sizeof text, "ALL CORE MACROS UP TO C++%02i", latest_rev());
        show(text, latest);
    }
    latest.clear();
    if (print.lib_features)
    {   // preserve reverse revision insertion order!
        LIB(32) LIB(29) LIB(26) LIB(23) LIB(20) LIB(17) LIB(14)
        std::snprintf(text, sizeof text, "ALL LIB MACROS UP TO C++%02i", latest_rev());
        show(text, latest);
    }
}

int main()
{
    if (print.separated_revisions)
    {
        PCORE(98) PCORE(11) PCORE(14) PLIB(14) PCORE(17) PLIB(17) PCORE(20) PLIB(20)
        PCORE(23) PLIB(23) PCORE(26) PLIB(26) PCORE(29) PLIB(29) PCORE(32) PLIB(32)
    }
    if (print.latest_revisions) show_latest();
    if (print.attributes) show("ATTRIBUTES", attributes);
    if (print.compiler_specific) show_compiler_specific_info();
}

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

C++11 CORE (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 CORE (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 LIB (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 LIB (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 ...

ALL CORE MACROS UP TO 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 ...

ALL LIB MACROS UP TO C++26 (158/255)
__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 ...

ATTRIBUTES (9/11)
assume                                        2022-07  =  2022-07
carries_dependency                            -------  <  2008-09
deprecated                                    2013-09  =  2013-09
fallthrough                                   2016-03  =  2016-03
... truncated ...

Compiler specific macros:
__cplusplus                                   202302L
__GNUG__                                      14
__GNUC_MINOR__                                2
__GNUC_PATCHLEVEL__                           0

Отчёты об ошибках

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

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

См. также

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

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

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/feature_test

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API