Пространства имён
Варианты
Действия

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

Материал из cppreference.com
< cpp

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

Атрибуты

__has_cpp_attribute( маркер-атрибута )

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

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

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

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

маркер-атрибута Атрибут Значение Стандарт Документ(ы)
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

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

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

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

Имя макроса Возможность Значение Стд
__cpp_aggregate_bases Агрегирование классов с базовыми классами 201603L (C++17)
__cpp_aggregate_nsdmi Агрегирование классов с инициализаторами элементов по умолчанию 201304L (C++14)
__cpp_aggregate_paren_init Агрегированная инициализация в форме прямой инициализации 201902L (C++20)
__cpp_alias_templates Шаблоны псевдонимов 200704L (C++11)
__cpp_aligned_new Динамическое выделение памяти для данных с нестандартным выравниванием 201606L (C++17)
__cpp_attributes Атрибуты 200809L (C++11)
__cpp_binary_literals Двоичные литералы 201304L (C++14)
__cpp_capture_star_this Лямбда-захват *this по значению как [=,*this] 201603L (C++17)
__cpp_char8_t char8_t 201811L (C++20)
__cpp_concepts Концепты 201907L (C++20)
__cpp_conditional_explicit explicit(bool) 201806L (C++20)
__cpp_consteval Немедленно выполняемые функции 201811L (C++20)
__cpp_constexpr constexpr 200704L (C++11)
Ослабленный constexpr, не-const constexpr методы 201304L (C++14)
Constexpr лямбда 201603L (C++17)
Тривиальный инициализация по умолчанию и объявление asm в constexpr функциях 201907L (C++20)
__cpp_constexpr_dynamic_alloc Операции для динамической длительности хранения в constexpr функциях 201907L (C++20)
__cpp_constexpr_in_decltype Создание определений функций и переменных, когда они необходимы для вычисления константы 201711L (C++20)
__cpp_constinit constinit 201907L (C++20)
__cpp_decltype decltype 200707L (C++11)
__cpp_decltype_auto Вывод типа возвращаемого значения для обычных функций 201304L (C++14)
__cpp_deduction_guides Вывод аргументов шаблона для шаблонов классов 201703L (C++17)
CTAD для агрегатов и псевдонимов 201907L (C++20)
__cpp_delegating_constructors Делегирование конструкторов 200604L (C++11)
__cpp_designated_initializers Назначенный инициализатор 201707L (C++20)
__cpp_enumerator_attributes Атрибуты для нумераторов 201411L (C++17)
__cpp_fold_expressions Выражения свёртки 201603L (C++17)
__cpp_generic_lambdas Общие лямбда-выражения 201304L (C++14)
Знакомый синтаксис шаблона для общих лямбд 201707L (C++20)
__cpp_guaranteed_copy_elision Гарантированный пропуск копирования за счёт упрощённой категории значений 201606L (C++17)
__cpp_hex_float Шестнадцатеричные литералы с плавающей запятой 201603L (C++17)
__cpp_if_consteval consteval if 202106L (C++23)
__cpp_if_constexpr constexpr if 201606L (C++17)
__cpp_impl_coroutine Сопрограммы (поддержка компилятором) 201902L (C++20)
__cpp_impl_destroying_delete Уничтожающий оператор delete (поддержка компилятором) 201806L (C++20)
__cpp_impl_three_way_comparison Трёхстороннее сравнение (поддержка компилятором) 201907L (C++20)
__cpp_inheriting_constructors Наследование конструкторов 200802L (C++11)
Переделка наследуемых конструкторов 201511L (C++17)
__cpp_init_captures Захват при инициализации лямбда 201304L (C++14)
Разрешено расширение пакета в захвате при инициализации лямбда 201803L (C++20)
__cpp_initializer_lists Список инициализации и std::initializer_list 200806L (C++11)
__cpp_inline_variables Встроенные переменные 201606L (C++17)
__cpp_lambdas Лямбда-выражения 200907L (C++11)
__cpp_modules Модули 201907L (C++20)
__cpp_namespace_attributes Атрибуты для пространств имён 201411L (C++17)
__cpp_noexcept_function_type Спецификации исключений сделаны частью системы типов 201510L (C++17)
__cpp_nontype_template_args Разрешено константное вычисление для всех аргументов шаблона, не относящиеся к типу 201411L (C++17)
Типы классов и типы с плавающей запятой в аргументах шаблона не являющихся типами 201911L (C++20)
__cpp_nontype_template_parameter_auto Объявление аргументов шаблона не являющиеся типами с auto 201606L (C++17)
__cpp_nsdmi Инициализаторы нестатических элементов данных 200809L (C++11)
__cpp_range_based_for Основанный на диапазоне цикл for 200907L (C++11)
Цикл for на основе диапазона с разными начальным/конечным типами 201603L (C++17)
__cpp_raw_strings Необработанные строковые литералы 200710L (C++11)
__cpp_ref_qualifiers Квалификаторы ссылок 200710L (C++11)
__cpp_return_type_deduction Вывод типа возвращаемого значения для обычных функций 201304L (C++14)
__cpp_rvalue_references Правосторонняя ссылка 200610L (C++11)
__cpp_size_t_suffix Литеральные суффиксы для size_t и её знаковой версии 202011L (C++23)
__cpp_sized_deallocation Освобождение памяти по размеру 201309L (C++14)
__cpp_static_assert static_assert 200410L (C++11)
Одно-аргументный static_assert 201411L (C++17)
__cpp_structured_bindings Структурные привязки 201606L (C++17)
__cpp_template_template_args Соответствие шаблонным аргументам шаблона 201611L (C++17)
__cpp_threadsafe_static_init Динамическая инициализация и уничтожение с конкуренцией 200806L (C++11)
__cpp_unicode_characters Новые символьные типы (char16_t и char32_t) 200704L (C++11)
__cpp_unicode_literals Строковые литералы в Юникоде 200710L (C++11)
__cpp_user_defined_literals Пользовательские литералы 200809L (C++11)
__cpp_using_enum Using enum 201907L (C++20)
__cpp_variable_templates Шаблоны переменных 201304L (C++14)
__cpp_variadic_templates Вариативные шаблоны 200704L (C++11)
__cpp_variadic_using Расширения пакетов в using-объявлении 201611L (C++17)

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

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

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

Имя макроса Возможность Значение Заголовок Стд
__cpp_lib_addressof_constexpr Constexpr std::addressof 201603L <memory> (C++17)
__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)
__cpp_lib_any std::any 201606L <any> (C++17)
__cpp_lib_apply std::apply 201603L <tuple> (C++17)
__cpp_lib_array_constexpr Constexpr для std::reverse_iterator, std::move_iterator, std::array и доступа в диапазоне 201603L <iterator> <array> (C++17)
ConstexprIterator; constexpr сравнение для std::array; разные constexpr биты (std::array::fill и другие) 201811L <iterator> <array> (C++20)
__cpp_lib_as_const std::as_const 201510L <utility> (C++17)
__cpp_lib_assume_aligned std::assume_aligned 201811L <memory> (C++20)
__cpp_lib_atomic_flag_test std::atomic_flag::test 201907L <atomic> (C++20)
__cpp_lib_atomic_float Атомарность с плавающей точкой 201711L <atomic> (C++20)
__cpp_lib_atomic_is_always_lock_free constexpr atomic<T>::is_always_lock_free 201603L <atomic> (C++17)
__cpp_lib_atomic_lock_free_type_aliases атомарные целочисленные типы без блокировок (std::atomic_signed_lock_free, std::atomic_unsigned_lock_free) 201907L <atomic> (C++20)
__cpp_lib_atomic_ref std::atomic_ref 201806L <atomic> (C++20)
__cpp_lib_atomic_shared_ptr std::atomic<std::shared_ptr> 201711L <memory> (C++20)
__cpp_lib_atomic_value_initialization Исправление атомарной инициализации (инициализация значения std::atomic по умолчанию) 201911L <atomic> <memory> (C++20)
__cpp_lib_atomic_wait Эффективное std::atomic ожидание 201907L <atomic> (C++20)
__cpp_lib_barrier std::barrier 201907L <barrier> (C++20)
__cpp_lib_bind_front std::bind_front 201907L <functional> (C++20)
__cpp_lib_bit_cast std::bit_cast 201806L <bit> (C++20)
__cpp_lib_bitops Битовые операции 201907L <bit> (C++20)
__cpp_lib_bool_constant std::bool_constant 201505L <type_traits> (C++17)
__cpp_lib_bounded_array_traits std::is_bounded_array, std::is_unbounded_array 201902L <type_traits> (C++20)
__cpp_lib_boyer_moore_searcher std::boyer_moore_searcher 201603L <functional> (C++17)
__cpp_lib_byte std::byte 201603L <cstddef> (C++17)
__cpp_lib_char8_t Библиотечная поддержка для char8_t 201907L