Тестирование функций (с C++20)
Стандарт определяет набор макросов препроцессора, соответствующих функциям языка 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) | N2556, N2643 |
deprecated |
[[deprecated]] |
201309L | (C++14) | N3760 |
fallthrough |
[[fallthrough]] |
201603L | (C++17) | P0188R1 |
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 |
201907L | (C++20) | P1301R4 | ||
noreturn |
[[noreturn]] |
200809L | (C++11) | N2761 |
unlikely |
[[unlikely]] |
201803L | (C++20) | P0479R5 |
| Общее количество атрибутов: 10 | ||||
Функциональные возможности языка
Следующие макросы предварительно определены в каждом единице трансляции. Каждый макрос расширяется до целочисленной константы, соответствующей году и месяцу, когда соответствующая функция была включена в рабочий проект.
При значительном изменении функции макрос будет соответствующим образом обновлён.
| Имя макроса | Функция | Значение | Std | Статья(и) |
|---|---|---|---|---|
__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++20) (DR) | P2513R4 | |
__cpp_concepts | Концепции | 201907L | (C++20) | P0734R0 P1084R2 P1452R2 |
| Условные тривиальные специальные члены | 202002L | (C++20) | P0848R3 P2493R0 |
|
__cpp_conditional_explicit | explicit(bool) | 201806L | (C++20) | P0892R2 |
__cpp_consteval | Немедленные функции | 201811L | (C++20) | P1073R3 |
Делать consteval распространяться вверх | 202211L | (C++20) (DR) | P2564R3 | |
__cpp_constexpr | constexpr | 200704L | (C++11) | N2235 |
Расслабленные constexpr, методы без const constexpr | 201304L | (C++14) | N3652 | |
| Константная лямбда | 201603L | (C++17) | P0170R1 | |
Вызовы виртуальных функций в константных выражениях; блоки try-catch в функциях constexpr, dynamic_cast и полиморфные typeid в константных выражениях; тривиальная инициализация по умолчанию и asm-декларация в функциях constexpr | 201907L | (C++20) | P1064R0 P1002R1 P1327R1 P1331R2 P1668R1 |
|
| Изменение активного члена объединения при вычислении констант | 202002L | (C++20) | P1330R0 P2493R0 |
|
Не-литеральные переменные, метки и goto операторы в функциях constexpr | 202110L | (C++23) | P2242R3 | |
| Расслабление некоторых ограничений на функции и шаблонные функции constexpr | 202207L | (C++23) | P2448R2 | |
| Разрешение статических constexpr переменных в функциях constexpr | 202211L | (C++23) | P2647R1 | |
Константное преобразование из void*: в сторону константного стирания типов | 202306L | (C++26) | P2738R1 | |
__cpp_constexpr_dynamic_alloc | Операции для динамического времени жизни в функциях constexpr | 201907L | (C++20) | P0784R7 |
__cpp_constexpr_in_decltype | Генерация определений функций и переменных, когда необходимы для оценки констант | 201711L | (C++11) (DR) | P0859R0 |
__cpp_constinit | constinit | 201907L | (C++20) | P1143R2 |
__cpp_decltype | decltype | 200707L | (C++11) | N2343 |
__cpp_decltype_auto | Вывод типа для обычных функций | 201304L | (C++14) | N3638 |
__cpp_deduction_guides | Вывод параметров шаблона для шаблонов классов | 201703L | (C++17) | P0091R3 P0512R0 P0620R0 |
| CTAD для агрегатных типов и псевдонимов | 201907L | (C++20) | P1814R0 P1816R0 |
|
__cpp_delegating_constructors | Конструкторы-делегаты | 200604L | (C++11) | N1986 |
__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 |
__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 | consteval if | 202106L | (C++23) | P1938R3 |
__cpp_if_constexpr | constexpr if | 201606L | (C++17) | P0292R2 |
__cpp_impl_coroutine | Корутины (поддержка компилятора) | 201902L | (C++20) | P0912R5 LWG3393 |
__cpp_impl_destroying_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 |
| Переформулировка наследования конструкторов | 201511L | (C++11) (DR) | 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 |
static operator[] | 202211L | (C++23) | P2589R1 | |
__cpp_named_character_escapes | Именные универсальные управляющие последовательности | 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_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 | квалификаторы ссылок | 200710L | (C++11) | N2439 |
__cpp_return_type_deduction | Вывод типа возвращаемого значения для обычных функций | 201304L | (C++14) | N3638 |
__cpp_rvalue_references | Ссылки на значения-переменные | 200610L | (C++11) | N2118 |
__cpp_size_t_suffix | Литеральные суффиксы для 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 | static operator() | 202207L | (C++23) | P1169R4 |
__cpp_structured_bindings | Структурированные привязки | 201606L | (C++17) | P0217R3 |
__cpp_template_template_args | Сопоставление аргументов шаблонов-шаблонов | 201611L | (C++17) | P0522R0 |
__cpp_threadsafe_static_init | Динамическая инициализация и уничтожение с конкурентностью | 200806L | (C++11) | N2660 |
__cpp_unicode_characters | Новые типы символов (char16_t и char32_t) | 200704L | (C++11) | N2249 |
__cpp_unicode_literals | Литералы строк Юникода | 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_templates | Шаблоны с переменным числом параметров | 200704L | (C++11) | N2242 |
__cpp_variadic_using | Расширения пакетов в using-объявлениях | 201611L | (C++17) | P0195R2 |
| Общее количество макросов: 68 | ||||
|---|---|---|---|---|
Функциональные возможности библиотеки
Следующие макросы определены, если включён заголовок <version> или любой из соответствующих заголовков в таблице ниже. Каждый макрос расширяется до целочисленной константы, соответствующей году и месяцу включения соответствующей функции в рабочий черновик.
При существенном изменении функции макрос будет обновлён соответственно.
| Название макроса | Функция | Значение | Заголовок | Стандарт | Статья(и) |
|---|---|---|---|---|---|
__cpp_lib_adaptor_iterator_pair_constructor | Конструкторы пар итераторов для std::stack и std::queue | 202106L | <queue> <stack> | (C++23) | P1425R4 |
__cpp_lib_addressof_constexpr | Константа std::addressof | 201603L | <memory> | (C++17) | LWG2296 |
__cpp_lib_algorithm_iterator_requirements | Итераторы диапазонов как входные данные для недиапазонных алгоритмов | 202207L | <algorithm> <memory> <numeric> | (C++23) | P2408R5 |
__cpp_lib_allocate_at_least | Обратная связь о размере в интерфейсе выделения памяти, например: std::allocator::allocate_at_least, std::allocator_traits::allocate_at_least | 202302L | <memory> | (C++23) | P0401R6 P2652R2 LWG3887 |
__cpp_lib_allocator_traits_is_always_equal | std::allocator_traits::is_always_equal | 201411L | <memory> <scoped_allocator> <string> <deque> <forward_list> <list> <vector> <map> <set> <unordered_map> <unordered_set> | (C++17) | N4258 |
__cpp_lib_any | std::any | 201606L | <any> | (C++17) | P0220R1 P0032R3 |
__cpp_lib_apply | std::apply | 201603L | <tuple> | (C++17) | P0220R1 |
__cpp_lib_array_constexpr | Константы для std::reverse_iterator, std::move_iterator, std::array и доступа к диапазонам | 201603L | <iterator> <array> | (C++17) | P0031R0 |
ConstexprIterator; сравнение по константе для std::array; различные фрагменты констант (std::array::fill и т. д.) | 201811L | <iterator> <array> | (C++20) | P0858R0 LWG3257 P1023R0 P1032R1 |
|
__cpp_lib_as_const | std::as_const | 201510L | <utility> | (C++17) | P0007R1 |
__cpp_lib_associative_heterogeneous_erasure | Гетерогенное стирание в ассоциативных контейнерах и неупорядоченных ассоциативных контейнерах | 202110L | <map> <set> <unordered_map> <unordered_set> | (C++23) | P2077R3 |
__cpp_lib_associative_heterogeneous_insertion | Гетерогенные перегрузки для оставшихся функций-членов в упорядоченных и неупорядоченных ассоциативных контейнерах | 202306L | <map> <set> <unordered_map> <unordered_set> | (C++26) | P2363R5 |
__cpp_lib_assume_aligned | std::assume_aligned | 201811L | <memory> | (C++20) | P1007R3 |
__cpp_lib_atomic_flag_test | std::atomic_flag::test | 201907L | <atomic> | (C++20) | P1135R6 |
__cpp_lib_atomic_float | Атомные числа с плавающей запятой | 201711L | <atomic> | (C++20) | P0020R6 |
__cpp_lib_atomic_is_always_lock_free | constexpr atomic<T>::is_always_lock_free | 201603L | <atomic> | (C++17) | P0152R1 |
__cpp_lib_atomic_lock_free_type_aliases | Атомные целочисленные типы без блокировки (std::atomic_signed_lock_free, std::atomic_unsigned_lock_free) | 201907L | <atomic> | (C++20) | P1135R6 |
__cpp_lib_atomic_ref | std::atomic_ref | 201806L | <atomic> | (C++20) | P0019R8 |
__cpp_lib_atomic_shared_ptr | std::atomic<std::shared_ptr> | 201711L | <memory> | (C++20) | P0718R2 |
__cpp_lib_atomic_value_initialization | Исправление инициализации атомарных переменных (значение по умолчанию - инициализация по умолчанию std::atomic) | 201911L | <atomic> <memory> | (C++20) | P0883R2 |
__cpp_lib_atomic_wait | Эффективное ожидание std::atomic | 201907L | <atomic> | (C++20) | P1135R6 |
__cpp_lib_barrier | std::barrier | 201907L | <barrier> | (C++20) | P1135R6 |
Гарантии завершения фазы std::barrier | 202302L | <barrier> | (C++23) | P2588R3 | |
__cpp_lib_bind_back | std::bind_back | 202202L | <functional> | (C++23) | P2387R3 |
Разрешить передачу вызываемых объектов как нетиповых шаблонных аргументов в std::bind_back | 202306L | <functional> | (C++26) | P2714R1 | |
__cpp_lib_bind_front | std::bind_front | 201907L | <functional> | (C++20) | P0356R5 P1651R0 |
Разрешить передачу вызываемых объектов как нетиповых шаблонных аргументов в std::bind_front | 202306L | <functional> | (C++26) | P2714R1 | |
__cpp_lib_bit_cast | std::bit_cast | 201806L | <bit> | (C++20) | P0476R2 |
__cpp_lib_bitops | Битовые операции | 201907L | <bit> | (C++20) | P0553R4 |
__cpp_lib_bitset | Взаимодействие std::bitset с std::string_view | 202306L | <bitset> | (C++26) | P2697R1 |
__cpp_lib_bool_constant | std::bool_constant | 201505L | <type_traits> | (C++17) | N4389 |
__cpp_lib_bounded_array_traits | std::is_bounded_array, std::is_unbounded_array | 201902L | <type_traits> | (C++20) | P1357R1 |
__cpp_lib_boyer_moore_searcher | Поисковые алгоритмы | 201603L | <functional> | (C++17) | P0220R1 |
__cpp_lib_byte | std::byte | 201603L | <cstddef> | (C++17) | P0298R3 |
__cpp_lib_byteswap | std::byteswap | 202110L | <bit> | (C++23) | P1272R4 |
__cpp_lib_char8_t | Поддержка библиотеки для char8_t | 201907L | <atomic> <filesystem> <istream> <limits> <locale> <ostream> <string> <string_view> | (C++20) | P0482R6 P1423R3 |
__cpp_lib_chrono | Функции округления для std::chrono::duration и std::chrono::time_point | 201510L | <chrono> | (C++17) | P0092R1 |
Constexpr для всех методов класса std::chrono::duration и std::chrono::time_point | 201611L | <chrono> | (C++17) | P0505R0 | |
| Календари и Временные зоны | 201907L | <chrono> | (C++20) | P0355R7 P1466R3 |
|
Поддержка хеширования std::chrono для классов значений времени | 202306L | <chrono> | (C++26) | P2592R3 | |
__cpp_lib_chrono_udls | Пользовательские литералы для типов времени | 201304L | <chrono> | (C++14) | N3642 |
__cpp_lib_clamp | std::clamp | 201603L | <algorithm> | (C++17) | P0025R0 |
__cpp_lib_common_reference | Сделать std::common_reference_t для std::reference_wrapper типом ссылки | 202302L | <type_traits> | (C++23) | P2655R3 |
__cpp_lib_common_reference_wrapper | Сделать std::common_reference_t из std::reference_wrapper типом ссылки | 202302L | <functional> | (C++23) | P2655R3 |
__cpp_lib_complex_udls | Операторы пользовательских литералов для std::complex | 201309L | <complex> | (C++14) | N3779 |
__cpp_lib_concepts | Стандартные концепции библиотеки | 202002L | <concepts> | (C++20) | P0898R3 P1754R1 P1964R2 |
Типы, только для перемещения, для equality_comparable_with, totally_ordered_with и three_way_comparable_with | 202207L | <compare> <concepts> | (C++23) | P2404R3 | |
__cpp_lib_constexpr_algorithms | Constexpr для алгоритмов | 201806L | <algorithm> <utility> | (C++20) | P0202R3 P0879R0 LWG3256 LWG3792 |
| Constexpr стабильная сортировка | 202306L | <algorithm> <utility> | (C++26) | P2562R1 | |
__cpp_lib_constexpr_bitset | Более constexpr std::bitset | 202207L | <bitset> | (C++23) | P2417R2 |
__cpp_lib_constexpr_charconv | Добавление модификаторов constexpr к функциям constexpr и std::to_chars для целочисленных типов | 202207L | <charconv> | (C++23) | P2291R3 |
__cpp_lib_constexpr_cmath | Constexpr для математических функций в <cmath> и <cstdlib> | 202202L | <cmath> <cstdlib> | (C++23) | P0533R9 |
Больше constexpr для <cmath> | 202306L | <cmath> <cstdlib> | (C++26) | P1383R2 | |
__cpp_lib_constexpr_complex | Constexpr для std::complex | 201711L | <complex> | (C++20) | P0415R1 |
Больше constexpr для <complex> | 202306L | <complex> | (C++26) | P1383R2 | |
__cpp_lib_constexpr_dynamic_alloc | Constexpr для std::allocator и связанных утилит | 201907L | <memory> | (C++20) | P0784R7 |
__cpp_lib_constexpr_functional | Разные constexpr детали (std::default_searcher); constexpr INVOKE | 201907L | <functional> | (C++20) | P1032R1 P1065R2 |
__cpp_lib_constexpr_iterator | Разные constexpr детали (std::insert_iterator и т. д.) | 201811L | <iterator> | (C++20) | P1032R1 |
__cpp_lib_constexpr_memory | Constexpr в std::pointer_traits | 201811L | <memory> | (C++20) | P1006R1 |
Constexpr std::unique_ptr | 202202L | <memory> | (C++23) | P2273R3 | |
__cpp_lib_constexpr_numeric | Constexpr для алгоритмов в <numeric> | 201911L | <numeric> | (C++20) | P1645R1 |
__cpp_lib_constexpr_string | Constexpr для std::string | 201907L | <string> | (C++20) | P0426R1 P1032R1 P0980R1 |
__cpp_lib_constexpr_string_view | Разные constexpr детали (std::string_view::copy) | 201811L | <string_view> | (C++20) | P0426R1 P1032R1 |
__cpp_lib_constexpr_tuple | Разные constexpr детали (std::tuple::operator= и т. д.) | 201811L | <tuple> | (C++20) | P1032R1 |
__cpp_lib_constexpr_typeinfo | Constexpr для std::type_info::operator== | 202106L | <typeinfo> | (C++23) | P1328R1 |
__cpp_lib_constexpr_utility | Разные constexpr детали (std::pair::operator= и т. д.) | 201811L | <utility> | (C++20) | P1032R1 |
__cpp_lib_constexpr_vector | Constexpr для std::vector | 201907L | <vector> | (C++20) | P1004R2 |
__cpp_lib_containers_ranges | Операции конструирования и вставки, учитывающие диапазоны, для контейнеров и строк | 202202L | <vector> <list> <forward_list> <map> <set> <unordered_map> <unordered_set> <deque> <queue> <stack> <string> | (C++23) | P1206R7 |
__cpp_lib_copyable_function | std::copyable_function | 202306L | <functional> | (C++26) | P2548R6 |
__cpp_lib_coroutine | Корутины (поддержка библиотекой) | 201902L | <coroutine> | (C++20) | P0912R5 LWG3393 |
__cpp_lib_debugging | Поддержка отладки | 202311L | <debugging> | (C++26) | P2546R5 |
__cpp_lib_destroying_delete | Уничтожение operator delete (поддержка библиотекой) | 201806L | <new> | (C++20) | P0722R3 |
__cpp_lib_enable_shared_from_this | std::enable_shared_from_this::weak_from_this | 201603L | <memory> | (C++17) | P0033R1 |
__cpp_lib_endian | std::endian | 201907L | <bit> | (C++20) | P0463R1 P1612R1 |
__cpp_lib_erase_if | Единообразное удаление из контейнеров | 202002L | <string> <deque> <forward_list> <list> <vector> <map> <set> <unordered_map> <unordered_set> | (C++20) | P1209R0 P1115R3 |
__cpp_lib_exchange_function | std::exchange | 201304L | <utility> | (C++14) | N3668 |
__cpp_lib_execution | Политики выполнения | 201603L | <execution> | (C++17) | P0024R2 |
std::execution::unsequenced_policy | 201902L | <execution> | (C++20) | P1001R2 | |
__cpp_lib_expected | шаблон класса std::expected | 202202L | <expected> | (C++23) | P0323R12 |
Монадные функции для std::expected | 202211L | <expected> | (C++23) | P2505R5 | |
__cpp_lib_filesystem | Библиотека файловой системы | 201703L | <filesystem> | (C++17) | P0218R1 P0219R1 P0392R0 P0317R1 |
__cpp_lib_flat_map | std::flat_map и std::flat_multimap | 202207L | <flat_map> | (C++23) | P0429R9 |
__cpp_lib_flat_set | std::flat_set и std::flat_multiset | 202207L | <flat_set> | (C++23) | P1222R4 LWG3751 |
__cpp_lib_format | Форматирование текста | 201907L | <format> | (C++20) | P0645R10 P1361R2 P1652R1 |
Проверка строк форматирования на этапе компиляции; уменьшение параметризации std::vformat_to | 202106L | <format> | (C++20) (DR) | P2216R3 | |
| Исправление обработки локалей в форматировщиках chrono; поддержка типов, не допускающих форматирования без const | 202110L | <format> | (C++20) (DR) | P2372R3 P2418R2 |
Вывод std::basic_format_string; уточнить обработку кодировок при локализованном форматировании типов chrono | 202207L | <format> | (C++23) | P2419R2 P2508R1 |
|
| Форматирование указателей | 202304L | <format> | (C++26) | P2510R3 | |
| Проверка типов аргументов форматирования | 202305L | <format> | (C++26) | P2757R3 | |
Член visit | 202306L | <format> | (C++26) | P2637R3 | |
| Строки форматирования во время выполнения | 202311L | <format> | (C++26) | P2918R2 | |
__cpp_lib_format_ranges | Форматирование диапазонов | 202207L | <format> | (C++23) | P2286R8 P2585R1 LWG3750 |
__cpp_lib_format_uchar | Исправить форматирование кодовых единиц как целых чисел | 202311L | <format> | (C++26) | P2909R4 |
__cpp_lib_formatters | Форматирование std::thread::id и std::stacktrace | 202302L | <thread> <thread> | (C++23) | P2693R1 |
__cpp_lib_forward_like | std::forward_like | 202207L | <utility> | (C++23) | P2445R1 |
__cpp_lib_freestanding_algorithm | Внестандартные средства в <algorithm> | 202311L | <algorithm> | (C++26) | P2407R5 |
__cpp_lib_freestanding_array | Сделать части std::array внестандартными | 202311L | <array> | (C++26) | P2407R5 |
__cpp_lib_freestanding_char_traits | Внестандартные std::char_traits | 202306L | <string> | (C++26) | P2338R4 |
__cpp_lib_freestanding_charconv | Внестандартные средства в <charconv> | 202306L | <charconv> | (C++26) | P2338R4 |
__cpp_lib_freestanding_cstdlib | Внестандартные средства в <cstdlib> | 202306L | <cmath> <cstdlib> | (C++26) | P2338R4 |
__cpp_lib_freestanding_cstring | Внестандартные средства в <cstring> | 202306L | <cstring> | (C++26) | P2338R4 |
Удаление std::strtok из внестандартных средств | 202311L | <cstring> | (C++26) | P2937R0 | |
__cpp_lib_freestanding_cwchar | Внестандартные средства в <cwchar> | 202306L | <cwchar> | (C++26) | P2338R4 |
__cpp_lib_freestanding_errc | Внестандартные std::errc | 202306L | <cerrno> <system_error> | (C++26) | P2338R4 |
__cpp_lib_freestanding_expected | Сделать части std::expected внестандартными | 202311L | <expected> | (C++26) | P2833R2 |
__cpp_lib_freestanding_feature_test_macros | Поддержка внестандартных макросов для проверки функций | 202306L | (C++26) | P2198R7 | |
__cpp_lib_freestanding_functional | Внестандартные средства в <functional> | 202306L | <functional> | (C++26) | P2198R7 |
__cpp_lib_freestanding_iterator | Внестандартные средства в <iterator> | 202306L | <iterator> | (C++26) | P2198R7 |
__cpp_lib_freestanding_mdspan | Внестандартный std::mdspan | 202311L | <mdspan> | (C++26) | P2833R2 |
__cpp_lib_freestanding_memory | Внестандартные средства в <memory> | 202306L | <memory> | (C++26) | P2198R7 |
__cpp_lib_freestanding_numeric | Внестандартные средства в <numeric> (арифметика насыщения) | 202311L | <numeric> | (C++26) | P0543R3 |
__cpp_lib_freestanding_operator_new | Определение operator new (необязательно в реализациях для свободного пространства) | 202306L | <new> | (C++26) | P2198R7 |
__cpp_lib_freestanding_optional | Делаем части std::optional доступными в свободном пространстве | 202311L | <optional> | (C++26) | P2407R5 |
__cpp_lib_freestanding_ranges | Средства для свободного пространства в <ranges> | 202306L | <ranges> | (C++26) | P2198R7 |
__cpp_lib_freestanding_ratio | Средства для свободного пространства в <ratio> | 202306L | <ratio> | (C++26) | P2198R7 |
__cpp_lib_freestanding_string_view | Делаем части std::string_view доступными в свободном пространстве | 202311L | <string_view> | (C++26) | P2407R5 |
__cpp_lib_freestanding_tuple | Средства для свободного пространства в <tuple> | 202306L | <tuple> | (C++26) | P2198R7 |
__cpp_lib_freestanding_utility | Средства для свободного пространства в <utility> | 202306L | <utility> | (C++26) | P2198R7 |
__cpp_lib_freestanding_variant | Делаем части std::variant доступными в свободном пространстве | 202311L | <variant> | (C++26) | P2407R5 |
__cpp_lib_fstream_native_handle | Получение системных дескрипторов из потоков файлов | 202306L | <fstream> | (C++26) | P1759R6 |
__cpp_lib_function_ref | std::function_ref: ссылка на вызываемый объект с типом-обёрткой | 202306L | <functional> | (C++26) | P0792R14 |
__cpp_lib_gcd_lcm | НОД, НОК | 201606L | <numeric> | (C++17) | P0295R0 |
__cpp_lib_generator | std::generator: генератор синхронных корутин для диапазонов | 202207L | <generator> | (C++23) | P2502R2 |
__cpp_lib_generic_associative_lookup | Поиск с гетерогенным сравнением в ассоциативных контейнерах | 201304L | <map> <set> | (C++14) | N3657 |
__cpp_lib_generic_unordered_lookup | Поиск с гетерогенным сравнением в неупорядоченных ассоциативных контейнерах | 201811L | <unordered_map> <unordered_set> | (C++20) | P0919R3 |
__cpp_lib_hardware_interference_size | constexpr std::hardware_{constructive, destructive}_interference_size | 201703L | <new> | (C++17) | P0154R1 |
__cpp_lib_has_unique_object_representations | std::has_unique_object_representations | 201606L | <type_traits> | (C++17) | P0258R2 |
__cpp_lib_hazard_pointer | Указатели-опасности | 202306L | <hazard_pointer> | (C++26) | P2530R3 |
__cpp_lib_hypot | 3-аргументная перегрузка std::hypot | 201603L | <cmath> | (C++17) | P0030R1 |
__cpp_lib_incomplete_container_elements | Минимальная поддержка неполных типов для std::forward_list, std::list и std::vector | 201505L | <forward_list> <list> <vector> | (C++17) | N4510 |
__cpp_lib_int_pow2 | Целочисленные операции над степенями двойки (std::has_single_bit, std::bit_ceil, std::bit_floor, std::bit_width) | 202002L | <bit> | (C++20) | P0556R3 P1956R1 |
__cpp_lib_integer_comparison_functions | Функции сравнения целых чисел | 202002L | <utility> | (C++20) | P0586R2 |
__cpp_lib_integer_sequence | Целочисленные последовательности во время компиляции | 201304L | <utility> | (C++14) | N3658 |
__cpp_lib_integral_constant_callable | std::integral_constant::operator() | 201304L | <type_traits> | (C++14) | N3545 |
__cpp_lib_interpolate | std::lerp, std::midpoint | 201902L | <cmath> <numeric> | (C++20) | P0811R3 |
__cpp_lib_invoke | std::invoke | 201411L | <functional> | (C++17) | N4169 |
__cpp_lib_invoke_r | std::invoke_r | 202106L | <functional> | (C++23) | P2136R3 |
__cpp_lib_ios_noreplace | Поддержка эксклюзивного режима для fstreams | 202207L | <ios> | (C++23) | P2467R1 |
__cpp_lib_is_aggregate | std::is_aggregate | 201703L | <type_traits> | (C++17) | LWG2911 |
__cpp_lib_is_constant_evaluated | std::is_constant_evaluated | 201811L | <type_traits> | (C++20) | P0595R2 |
__cpp_lib_is_final | std::is_final | 201402L | <type_traits> | (C++14) | LWG2112 |
__cpp_lib_is_implicit_lifetime | std::is_implicit_lifetime | 202302L | <type_traits> | (C++23) | P2674R1 |
__cpp_lib_is_invocable | std::is_invocable, std::invoke_result | 201703L | <type_traits> | (C++17) | P0604R0 |
__cpp_lib_is_layout_compatible | std::is_layout_compatible | 201907L | <type_traits> | (C++20) | P0466R5 |
__cpp_lib_is_nothrow_convertible | std::is_nothrow_convertible | 201806L | <type_traits> | (C++20) | P0758R1 LWG3356 |
__cpp_lib_is_null_pointer | std::is_null_pointer | 201309L | <type_traits> | (C++14) | LWG2247 |
__cpp_lib_is_pointer_interconvertible | Свойства взаимной преобразуемости указателей: std::is_pointer_interconvertible_with_class, std::is_pointer_interconvertible_base_of | 201907L | <type_traits> | (C++20) | P0466R5 |
__cpp_lib_is_scoped_enum | std::is_scoped_enum | 202011L | <type_traits> | (C++23) | P1048R1 |
__cpp_lib_is_swappable | [nothrow-]свойства обмениваемости | 201603L | <type_traits> | (C++17) | P0185R1 |
__cpp_lib_is_within_lifetime | Проверка активности альтернативы объединения (std::is_within_lifetime) | 202306L | <type_traits> | (C++26) | P2641R4 |
__cpp_lib_jthread | Маркер остановки и присоединяемый поток | 201911L | <stop_token> <thread> | (C++20) | P0660R10 P1869R1 |
__cpp_lib_latch | std::latch | 201907L | <latch> | (C++20) | P1135R6 |
__cpp_lib_launder | Основная проблема 1776: Замена объектов класса, содержащих члены-ссылки (std::launder) | 201606L | <new> | (C++17) | P0137R1 |
__cpp_lib_linalg | Интерфейс линейной алгебры для свободных функций, основанный на BLAS | 202311L | <linalg> | (C++26) | P1673R13 |
__cpp_lib_list_remove_return_type | Изменение типа возвращаемого значения для членов remove(), remove_if() и unique() в std::forward_list и std::list | 201806L | <forward_list> <list> | (C++20) | P0646R1 |
__cpp_lib_logical_traits | Логические операции над типами | 201510L | <type_traits> | (C++17) | P0013R1 |
__cpp_lib_make_from_tuple | std::make_from_tuple() | 201606L | <tuple> | (C++17) | P0209R2 |
__cpp_lib_make_reverse_iterator | std::make_reverse_iterator | 201402L | <iterator> | (C++14) | LWG2285 |
__cpp_lib_make_unique | std::make_unique | 201304L | <memory> | (C++14) | N3656 |
__cpp_lib_map_try_emplace | std::map::insert_or_assign, std::map::try_emplace | 201411L | <map> | (C++17) | N4279 |
__cpp_lib_math_constants | Математические константы | 201907L | <numbers> | (C++20) | P0631R8 |
__cpp_lib_math_special_functions | Математические специальные функции для C++17 | 201603L | <cmath> | (C++17) | P0226R1 |
__cpp_lib_mdspan | std::mdspan | 202207L | <mdspan> | (C++23) | P0009R18 P2599R2 P2604R0 P2613R1 |
__cpp_lib_memory_resource | std::pmr::memory_resource | 201603L | <memory_resource> | (C++17) | P0220R1 |
__cpp_lib_modules | Модули стандартной библиотеки std и std.compat | 202207L | (C++23) | P2465R3 | |
__cpp_lib_move_iterator_concept | Преобразование std::move_iterator<T*> в итератор произвольного доступа | 202207L | <iterator> | (C++23) | P2520R0 |
__cpp_lib_move_only_function | std::move_only_function | 202110L | <functional> | (C++23) | P0288R9 |
__cpp_lib_node_extract | Вставка в карты и множества (std::map::extract, std::map::merge, std::map::insert(node_type), и др.) | 201606L | <map> <set> std::data() <unordered_set> | (C++17) | P0083R3 |
__cpp_lib_nonmember_container_access | std::size(), std::empty() и std::data() | 201411L | <iterator> <array> <deque> <forward_list> <list> <map> <regex> <set> <string> <unordered_map> <unordered_set> <vector> | (C++17) | N4280 |
__cpp_lib_not_fn | std::not_fn() | 201603L | <functional> | (C++17) | P0005R4 |
Возможность передачи вызываемых объектов в качестве нетиповых шаблонных аргументов в std::not_fn | 202306L | <functional> | (C++26) | P2714R1 | |
__cpp_lib_null_iterators | Нулевые LegacyForwardIterators | 201304L | <iterator> | (C++14) | N3644 |
__cpp_lib_optional | std::optional | 201606L | <optional> | (C++17) | P0220R1 P0032R3 P0307R2 |
Полностью constexpr std::optional | 202106L | <optional> | (C++20) (DR) | P2231R1 | |
Монадные операции в std::optional | 202110L | <optional> | (C++23) | P0798R8 LWG3621 |
|
__cpp_lib_out_ptr | std::out_ptr, std::inout_ptr | 202106L | <memory> | (C++23) | P1132R7 |
Автономные std::out_ptr, std::inout_ptr | 202311L | <memory> | (C++26) | P2833R2 | |
__cpp_lib_parallel_algorithm | Параллельные алгоритмы | 201603L | <algorithm> <numeric> | (C++17) | P0024R2 |
__cpp_lib_polymorphic_allocator | std::pmr::polymorphic_allocator<> в качестве типа словаря | 201902L | <memory_resource> | (C++20) | P0339R6 LWG3437 |
__cpp_lib_print | Форматированный вывод | 202207L | <ostream> <print> | (C++23) | P2093R14 |
__cpp_lib_quoted_string_io | std::quoted | 201304L | <iomanip> | (C++14) | N3654 |
__cpp_lib_ranges | Библиотека Ranges и ограниченные алгоритмы | 201911L | <algorithm> <functional> <iterator> <memory> <ranges> | (C++20) | P0896R4 P1035R7 P1716R3 |
| Не-инициализируемые по умолчанию представления | 202106L | (C++20) (DR) | P2325R3 | ||
| Представления с владением | 202110L | (C++20) (DR) | P2415R2 | ||
std::ranges::range_adaptor_closure | 202202L | (C++23) | P2387R3 | ||
| Смягчение адаптеров диапазонов для поддержки типов, только перемещаемых | 202207L | (C++23) | P2494R2 | ||
Удаление перегрузок «ядовитой пилюли» в ranges::begin, ranges::end, ranges::rbegin, ranges::rend, и ranges::size | 202211L | (C++23) | P2602R2 | ||
| Смягчение диапазонов, чтобы разрешить определённые проекции | 202302L | (C++23) | P2609R3 | ||
__cpp_lib_ranges_as_const | std::const_iterator, std::ranges::as_const_view | 202207L | <ranges> | (C++23) | P2278R4 |
Делает std::basic_const_iterator следовать за конвертируемостью лежащего в основе типа | 202311L | <ranges> | (C++26) | P2836R1 | |
__cpp_lib_ranges_as_rvalue | std::ranges::as_rvalue_view | 202207L | <ranges> | (C++23) | P2446R2 |
__cpp_lib_ranges_cartesian_product | std::ranges::cartesian_product_view | 202207L | <ranges> | (C++23) | P2374R4 P2540R1 |
__cpp_lib_ranges_chunk | std::ranges::chunk_view | 202202L | <ranges> | (C++23) | P2442R1 |
__cpp_lib_ranges_chunk_by | std::ranges::chunk_by_view | 202202L | <ranges> | (C++23) | P2443R1 |
__cpp_lib_ranges_contains | std::ranges::contains | 202207L | <algorithm> | (C++23) | P2302R4 |
__cpp_lib_ranges_enumerate | std::ranges::enumerate_view | 202302L | <ranges> | (C++23) | P2164R9 |
__cpp_lib_ranges_find_last | std::find_last(), std::find_last(), и std::find_last() | 202207L | <algorithm> | (C++23) | P1223R5 LWG3807 |
__cpp_lib_ranges_fold | std::ranges алгоритмы fold | 202207L | <algorithm> | (C++23) | P2322R6 |
__cpp_lib_ranges_iota | std::ranges::iota | 202202L | <numeric> | (C++23) | P2440R1 |
__cpp_lib_ranges_join_with | std::ranges::join_with_view | 202202L | <ranges> | (C++23) | P2441R2 |
__cpp_lib_ranges_repeat | std::ranges::repeat_view | 202207L | <ranges> | (C++23) | P2474R2 |
__cpp_lib_ranges_slide | std::ranges::slide_view | 202202L | <ranges> | (C++23) | P2442R1 |
__cpp_lib_ranges_starts_ends_with | std::ranges::starts_with, std::ranges::ends_with | 202106L | <algorithm> | (C++23) | P1659R3 |
__cpp_lib_ranges_stride | std::ranges::stride_view | 202207L | <ranges> | (C++23) | P1899R3 |
__cpp_lib_ranges_to_container | std::ranges::to | 202202L | <ranges> | (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 | <ranges> <tuple> <utility> | (C++23) | P2321R2 |
__cpp_lib_ratio | Добавление новых префиксов СИ 2022 года | 202306L | <ratio> | (C++26) | P2734R0 |
__cpp_lib_raw_memory_algorithms | Расширение инструментов управления памятью | 201606L | <memory> | (C++17) | P0040R3 |
__cpp_lib_rcu | Read-Copy Update (RCU) | 202306L | <rcu> | (C++26) | P2545R4 |
__cpp_lib_reference_from_temporary | std::reference_constructs_from_temporary и std::reference_converts_from_temporary | 202202L | <type_traits> | (C++23) | P2255R2 |
__cpp_lib_remove_cvref | std::remove_cvref | 201711L | <type_traits> | (C++20) | P0550R2 |
__cpp_lib_result_of_sfinae | std::result_of и SFINAE | 201210L | <type_traits> <functional> | (C++14) | N3462 |
__cpp_lib_robust_nonmodifying_seq_ops | Улучшение стабильности немодифицирующих операций со последовательностями (перегрузки двух диапазонов для std::mismatch, std::equal и std::is_permutation) | 201304L | <algorithm> | (C++14) | N3671 |
__cpp_lib_sample | std::sample | 201603L | <algorithm> | (C++17) | P0220R1 |
__cpp_lib_saturation_arithmetic | Арифметика насыщения | 202311L | <numeric> | (C++26) | P0543R3 |
__cpp_lib_scoped_lock | std::scoped_lock | 201703L | <mutex> | (C++17) | P0156R2 |
__cpp_lib_semaphore | std::counting_semaphore, std::binary_semaphore | 201907L | <semaphore> | (C++20) | P1135R6 |
__cpp_lib_shared_mutex | std::shared_mutex (бестим) | 201505L | <shared_mutex> | (C++17) | N4508 |
__cpp_lib_shared_ptr_arrays | std::shared_ptr<T[]> | 201611L | <memory> | (C++17) | P0497R0 |
Поддержка массивов для std::make_shared | 201707L | <memory> | (C++20) | P0674R1 | |
__cpp_lib_shared_ptr_weak_type | shared_ptr::weak_type | 201606L | <memory> | (C++17) | P0163R0 |
__cpp_lib_shared_timed_mutex | std::shared_timed_mutex | 201402L | <shared_mutex> | (C++14) | N3891 |
__cpp_lib_shift | std::shift_left и std::shift_right | 201806L | <algorithm> | (C++20) | P0769R2 |
std::ranges::shift_left и std::ranges::shift_right | 202202L | <algorithm> | (C++23) | P2440R1 | |
__cpp_lib_smart_ptr_for_overwrite | Создание умных указателей с инициализацией по умолчанию (std::allocate_shared_for_overwrite, std::make_shared_for_overwrite, std::make_unique_for_overwrite) | 202002L | <memory> | (C++20) | P1020R1 P1973R1 |
__cpp_lib_smart_ptr_owner_equality | Включение возможности использования std::weak_ptr в качестве ключей в неупорядоченных ассоциативных контейнерах | 202306L | <memory> | (C++26) | P1901R2 |
__cpp_lib_source_location | Получение информации о коде источника (std::source_location) | 201907L | <source_location> | (C++20) | P1208R6 |
__cpp_lib_span | std::span | 202002L | <span> | (C++20) | P0122R7 LWG3274 P1024R3 P1976R2 |
std::span::at | 202311L | <span> | (C++26) | P2821R5 | |
Делаем части std::span автономными | 202311L | <span> | (C++26) | P2833R2 | |
__cpp_lib_span_initializer_list | Создание std::span из списка инициализаторов | 202311L | <span> | (C++26) | P2447R6 |
__cpp_lib_spanstream | std::spanbuf, std::spanstream | 202106L | <spanstream> | (C++23) | P0448R4 |
__cpp_lib_ssize | std::ssize и беззнаковое std::span::size | 201902L | <iterator> | (C++20) | P1227R2 |
__cpp_lib_sstream_from_string_view | Взаимодействие std::stringstream с std::string_view | 202306L | <sstream> | (C++26) | P2495R3 |
__cpp_lib_stacktrace | Библиотека Stacktrace | 202011L | <stacktrace> | (C++23) | P0881R7 |
__cpp_lib_start_lifetime_as | Явное управление жизненным циклом (std::start_lifetime_as) | 202207L | <memory> | (C++23) | P2590R2 |
__cpp_lib_starts_ends_with | Проверка префиксов и суффиксов строк (starts_with() и ends_with() для std::string и std::string_view) | 201711L | <string> <string_view> | (C++20) | P0457R2 |
__cpp_lib_stdatomic_h | Заголовочный файл совместимости для атомных операций C | 202011L | <stdatomic.h> | (C++23) | P0943R6 |
__cpp_lib_string_contains | Функции contains из std::basic_string и std::basic_string_view | 202011L | <string> <string_view> | (C++23) | P1679R3 |
__cpp_lib_string_resize_and_overwrite | std::basic_string::resize_and_overwrite | 202110L | <string> | (C++23) | P1072R10 |
__cpp_lib_string_udls | Пользовательские литералы для типов строк | 201304L | <string> | (C++14) | N3642 |
__cpp_lib_string_view | std::string_view | 201606L | <string> <string_view> | (C++17) | P0220R1 P0254R2 |
| ConstexprIterator | 201803L | <string> <string_view> | (C++20) | P0858R0 LWG3257 |
|
__cpp_lib_submdspan | std::submdspan | 202306L | <mdspan> | (C++26) | P2630R4 |
__cpp_lib_syncbuf | Синхронизированный буферизованный ostream (std::syncbuf, std::osyncstream) и манипуляторы | 201803L | <syncstream> | (C++20) | P0053R7 P0753R2 |
__cpp_lib_text_encoding | std::text_encoding | 202306L | <text_encoding> | (C++26) | P1885R12 |
__cpp_lib_three_way_comparison | Сравнение с тремя результатами (поддержка библиотекой); добавление сравнения с тремя результатами в библиотеку | 201907L | <compare> | (C++20) | P0768R1 P1614R2 |
__cpp_lib_to_address | Утилита для преобразования указателя в сырой указатель (std::to_address) | 201711L | <memory> | (C++20) | P0653R2 |
__cpp_lib_to_array | std::to_array | 201907L | <array> | (C++20) | P0325R4 |
__cpp_lib_to_chars | Элементарные преобразования строк (std::to_chars, std::from_chars) | 201611L | <charconv> | (C++17) | P0067R5 P0682R1 LWG3137 |
Проверка успеха или неудачи функций <charconv> | 202306L | <charconv> | (C++26) | P2497R0 |
__cpp_lib_to_string | Переопределение std::to_string в терминах std::format | 202306L | <string> | (C++26) | P2587R3 |
__cpp_lib_to_underlying | std::to_underlying | 202102L | <utility> | (C++23) | P1682R2 |
__cpp_lib_transformation_trait_aliases | Псевдонимы шаблонов для TransformationTraits | 201304L | <type_traits> | (C++14) | N3655 |
__cpp_lib_transparent_operators | Функторы прозрачных операторов (std::less<> и др.) | 201210L | <functional> | (C++14) | N3421 |
Прозрачные std::owner_less (std::owner_less<void>) | 201510L | <memory> <functional> | (C++17) | P0074R0 | |
__cpp_lib_tuple_element_t | std::tuple_element_t | 201402L | <tuple> | (C++14) | N3887 |
__cpp_lib_tuple_like | Совместимость между std::tuple и объектами, похожими на кортежи (std::pair, std::array, std::subrange) | 202207L | <map> <tuple> <unordered_map> <utility> | (C++23) | P2165R4 |
Добавить протокол кортежа к std::complex | 202311L | (C++26) | P2819R2 | ||
__cpp_lib_tuples_by_type | Обращение к кортежам по типу | 201304L | <tuple> <utility> | (C++14) | N3670 |
__cpp_lib_type_identity | std::type_identity | 201806L | <type_traits> | (C++20) | P0887R1 |
__cpp_lib_type_trait_variable_templates | Шаблоны-переменные для признаков типов (std::is_void_v, и т.д.) | 201510L | <type_traits> | (C++17) | P0006R0 |
__cpp_lib_uncaught_exceptions | std::uncaught_exceptions | 201411L | <exception> | (C++17) | N4259 |
__cpp_lib_unordered_map_try_emplace | std::unordered_map::try_emplace, std::unordered_map::insert_or_assign | 201411L | <unordered_map> | (C++17) | N4279 |
__cpp_lib_unreachable | std::unreachable | 202202L | <utility> | (C++23) | P0627R6 |
__cpp_lib_unwrap_ref | std::unwrap_ref_decay и std::unwrap_reference | 201811L | <type_traits> | (C++20) | P0318R1 LWG3348 |
__cpp_lib_variant | std::variant: тип-безопасный союз для C++17 | 201606L | <variant> | (C++17) | P0088R3 P0393R3 P0032R3 |
std::visit для классов, производных от std::variant | 202102L | <variant> | (C++17) (DR) | P2162R2 | |
Полностью constexpr std::variant | 202106L | <variant> | (C++20) (DR) | P2231R1 | |
Член visit | 202306L | <variant> | (C++26) | P2637R3 | |
__cpp_lib_void_t | std::void_t | 201411L | <type_traits> | (C++17) | N3911 |
| Общее количество макросов: 227 | |||||
|---|---|---|---|---|---|
Пример
Обычное использование
#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 { 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 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] == '_' ? 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[] = {
//< Continue to Populate
COMPILER_FEATURE_ENTRY(202306L, __cpp_constexpr)
COMPILER_FEATURE_ENTRY(202311L, __cpp_pack_indexing)
COMPILER_FEATURE_ENTRY(202306L, __cpp_placeholder_variables)
COMPILER_FEATURE_ENTRY(202306L, __cpp_static_assert)
};
static constexpr CompilerFeature cxx26_lib[] = {
//< Continue to Populate
COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_associative_heterogeneous_insertion)
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(202306L, __cpp_lib_constexpr_cmath)
COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_constexpr_complex)
COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_copyable_function)
COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_debugging)
COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_format)
COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_format_uchar)
COMPILER_FEATURE_ENTRY(202311L, __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(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(202306L, __cpp_lib_freestanding_memory)
COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_freestanding_numeric)
COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_freestanding_operator_new)
COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_freestanding_optional)
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(202306L, __cpp_lib_hazard_pointer)
COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_is_within_lifetime)
COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_linalg)
COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_not_fn)
COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_out_ptr)
COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_ranges_as_const)
COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_ratio)
COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_rcu)
COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_saturation_arithmetic)
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(202306L, __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(202311L, __cpp_lib_tuple_like)
COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_variant)
};
static constexpr CompilerFeature cxx29_core[] = {
//< Continue to Populate
COMPILER_FEATURE_ENTRY(202604L, __cpp_core_TODO)
};
static constexpr CompilerFeature cxx29_lib[] = {
//< Continue to Populate
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(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("");
}
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 macros
if (print.core_features)
{ // preserve reverse revision insertion order!
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, "ALL CORE MACROS UP TO C++%02i", latest_rev());
show(text, latest);
}
latest.clear();
if (print.lib_features)
{ // preserve reverse revision insertion order!
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, "ALL LIB MACROS UP TO 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 LIB" , 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 LIB" , 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 LIB" , 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 LIB" , 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.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 (34/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 (59/68) __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 (146/227) __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/10) assume 2022-07 = 2022-07 carries_dependency ------- < 2008-09 deprecated 2013-09 = 2013-09 fallthrough 2016-03 = 2016-03 ... truncated ... Compiler specific macros: __cplusplus 202100L __GNUG__ 13 __GNUC_MINOR__ 1 __GNUC_PATCHLEVEL__ 1
Отчеты об ошибках
Следующие отчеты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применено к | Поведение как опубликовано | Правильное поведение |
|---|---|---|---|
| P2552R3 | C++20 |
__has_cpp_attribute должно расширяться до ненулевого значения для стандартных атрибутов | может расширяться до 0 |
См. также
| Макросы тестирования функций библиотеки (C++20) | определены в заголовке <version> |
| Документация C++ для Предварительно определенные макросы | |
| Документация C++ для Индекс макросов символов | |
Внешние ссылки
| 1. | Официальный документ по рекомендациям по тестированию функций |
| 2. | Исходный код для вывода функций компилятора |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/feature_test