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

Макросы проверки возможностей (начиная с 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 <atomic> <filesystem> <istream> <limits> <locale> <ostream> <string> <string_view> (C++20)
__cpp_lib_chrono Функции округления для std::chrono::duration и std::chrono::time_point 201510L <chrono> (C++17)
Constexpr для всех функций-элементов std::chrono::duration и std::chrono::time_point 201611L <chrono> (C++17)
Календари и Часовые Пояса 201907L <chrono> (C++20)
__cpp_lib_chrono_udls Определяемые пользователем литералы для типов времени 201304L <chrono> (C++14)
__cpp_lib_clamp std::clamp 201603L <algorithm> (C++17)
__cpp_lib_complex_udls Пользовательские литералы для std::complex 201309L <complex> (C++14)
__cpp_lib_concepts Концепты стандартной библиотеки 202002L <concepts> (C++20)
__cpp_lib_constexpr_algorithms Constexpr для алгоритмов 201806L <algorithm> (C++20)
__cpp_lib_constexpr_complex Constexpr для std::complex 201711L <complex> (C++20)
__cpp_lib_constexpr_dynamic_alloc Constexpr для std::allocator и связанных утилит 201907L <memory> (C++20)
__cpp_lib_constexpr_functional Разные constexpr биты (std::default_searcher); constexpr INVOKE 201907L <functional> (C++20)
__cpp_lib_constexpr_iterator Разные constexpr биты (std::insert_iterator и другие) 201811L <iterator> (C++20)
__cpp_lib_constexpr_memory Constexpr в std::pointer_traits 201811L <memory> (C++20)
__cpp_lib_constexpr_numeric Constexpr для числовых алгоритмов 201911L <numeric> (C++20)
__cpp_lib_constexpr_string Constexpr для std::string 201907L <string> (C++20)
__cpp_lib_constexpr_string_view Разные constexpr биты (std::string_view::copy) 201811L <string_view> (C++20)
__cpp_lib_constexpr_tuple Разные constexpr биты (std::tuple::operator= и другие) 201811L <tuple> (C++20)
__cpp_lib_constexpr_typeinfo Constexpr для std::type_info::operator== 202106L <typeinfo> (C++23)
__cpp_lib_constexpr_utility Разные constexpr биты (std::pair::operator= и другие) 201811L <utility> (C++20)
__cpp_lib_constexpr_vector Constexpr для std::vector 201907L <vector> (C++20)
__cpp_lib_coroutine Сопрограммы (поддержка библиотекой) 201902L <coroutine> (C++20)
__cpp_lib_destroying_delete Уничтожение operator delete (поддержка библиотекой) 201806L <new> (C++20)
__cpp_lib_enable_shared_from_this Более точная спецификация std::enable_shared_from_this 201603L <memory> (C++17)
__cpp_lib_endian std::endian 201907L <bit> (C++20)
__cpp_lib_erase_if Равномерная очистка контейнера 202002L <string> <deque> <forward_list> <list> <vector> <map> <set> <unordered_map> <unordered_set> (C++20)
__cpp_lib_exchange_function std::exchange 201304L <utility> (C++14)
__cpp_lib_execution Политики исполнения 201603L <execution> (C++17)
std::execution::unsequenced_policy 201902L <execution> (C++20)
__cpp_lib_filesystem Библиотека файловой системы 201703L <filesystem> (C++17)
__cpp_lib_format Форматирование текста 201907L <format> (C++20)
__cpp_lib_gcd_lcm std::gcd, std::lcm 201606L <numeric> (C++17)
__cpp_lib_generic_associative_lookup Поиск гетерогенным сравнением в [[cpp/container#Ассоциативные контейнеры|ассоциативных контейнерах 201304L <map> <set> (C++14)
__cpp_lib_generic_unordered_lookup Поиск гетерогенным сравнением в ассоциативных контейнерах 201811L <unordered_map> <unordered_set> (C++20)
__cpp_lib_hardware_interference_size [[constexpr std::hardware_{constructive, destructive}_interference_size|hardware_destructive_interference_size|constexpr std::hardware_{constructive, destructive}_interference_size]]]] 201703L <new> (C++17)
__cpp_lib_has_unique_object_representations std::has_unique_object_representations 201606L <type_traits> (C++17)
__cpp_lib_hypot 3-аргументная перегрузка std::hypot 201603L <cmath> (C++17)
__cpp_lib_incomplete_container_elements Минимальная поддержка неполных типов для стандартных контейнеров 201505L <forward_list> <list> <vector> (C++17)
__cpp_lib_int_pow2 Интегральные операции степени двойки (std::has_single_bit, std::bit_ceil, std::bit_floor, std::bit_length) 202002L <bit> (C++20)
__cpp_lib_integer_comparison_functions Целочисленные функции сравнения 202002L <utility> (C++20)
__cpp_lib_integer_sequence Целочисленные последовательности времени компиляции 201304L <utility> (C++14)
__cpp_lib_integral_constant_callable std::integral_constant 201304L <type_traits> (C++14)
__cpp_lib_interpolate std::lerp, std::midpoint 201902L <cmath> <numeric> (C++20)
__cpp_lib_invoke std::invoke 201411L <functional> (C++17)
__cpp_lib_invoke_r std::invoke_r 202106L <functional> (C++23)
__cpp_lib_is_aggregate std::is_aggregate 201703L <type_traits> (C++17)
__cpp_lib_is_constant_evaluated std::is_constant_evaluated 201811L <type_traits> (C++20)
__cpp_lib_is_final std::is_final 201402L <type_traits> (C++14)
__cpp_lib_is_invocable std::is_invocable, std::invoke_result 201703L <type_traits> (C++17)
__cpp_lib_is_layout_compatible std::is_layout_compatible 201907L <type_traits> (C++20)
__cpp_lib_is_nothrow_convertible std::is_nothrow_convertible 201806L <type_traits> (C++20)
__cpp_lib_is_null_pointer std::is_null_pointer 201309L <type_traits> (C++14)
__cpp_lib_is_pointer_interconvertible Свойства указателя-взаимоконвертируемости 201907L <type_traits> (C++20)
__cpp_lib_is_scoped_enum std::is_scoped_enum 202011L <type_traits> (C++23)
__cpp_lib_is_swappable [nothrow-]замена свойств 201603L <type_traits> (C++17)
__cpp_lib_jthread Стоповый токен и присоединяющаяся ветвь 201911L <stop_token> <thread> (C++20)
__cpp_lib_latch std::latch 201907L <latch> (C++20)
__cpp_lib_launder Основной Выпуск 1776: Обмен объектов класса, содержащих ссылочные элементы (std::launder) 201606L <new> (C++17)
__cpp_lib_list_remove_return_type Изменение типа возврата std::list::remove, std::list::remove_if и std::list::unique элементов объектов std::forward_list и std::list 201806L <forward_list> <list> (C++20)
__cpp_lib_logical_traits Свойства типа логического оператора 201510L <type_traits> (C++17)
__cpp_lib_make_from_tuple std::make_from_tuple() 201606L <tuple> (C++17)
__cpp_lib_make_reverse_iterator std::make_reverse_iterator 201402L <iterator> (C++14)
__cpp_lib_make_unique std::make_unique 201304L <memory> (C++14)
__cpp_lib_map_try_emplace std::map::try_emplace, std::map::insert_or_assign 201411L <map> (C++17)
__cpp_lib_math_constants Математические константы 201907L <numbers> (C++20)
__cpp_lib_math_special_functions Специальные математические функции для C++17 201603L <cmath> (C++17)
__cpp_lib_memory_resource std::pmr::memory_resource 201603L <memory_resource> (C++17)
__cpp_lib_node_extract Объединение карт и наборов (std::map::extract, std::map::merge, std::map::insert(node_type) и т.д.) 201606L <map> <set> <unordered_map> <unordered_set> (C++17)
__cpp_lib_nonmember_container_access std::size(), std::data() и std::empty() 201411L <iterator> <array> <deque> <forward_list> <list> <map> <regex> <set> <string> <unordered_map> <unordered_set> <vector> (C++17)
__cpp_lib_not_fn std::not_fn() 201603L <functional> (C++17)
__cpp_lib_null_iterators Null LegacyForwardIterators 201304L <iterator> (C++14)
__cpp_lib_optional std::optional 201606L <optional> (C++17)
__cpp_lib_parallel_algorithm Параллельные алгоритмы 201603L <algorithm> <numeric> (C++17)
__cpp_lib_polymorphic_allocator std::polymorphic_allocator как тип словаря 201902L <memory_resource> (C++20)
__cpp_lib_quoted_string_io std::quoted 201304L <iomanip> (C++14)
__cpp_lib_ranges Библиотека диапазонов и ограниченные алгоритмы 201911L <algorithm> <functional> <iterator> <memory> <ranges> (C++20)
__cpp_lib_raw_memory_algorithms Расширение инструментов управления памятью 201606L <memory> (C++17)
__cpp_lib_remove_cvref std::remove_cvref 201711L <type_traits> (C++20)
__cpp_lib_result_of_sfinae std::result_of и SFINAE 201210L <type_traits> <functional> (C++14)
__cpp_lib_robust_nonmodifying_seq_ops Повышение устойчивости последовательности немодифицирующих операций (двухдиапазонные перегрузки для std::mismatch, std::equal и std::is_permutation) 201304L <algorithm> (C++14)
__cpp_lib_sample std::sample 201603L <algorithm> (C++17)
__cpp_lib_scoped_lock std::scoped_lock 201703L <mutex> (C++17)
__cpp_lib_semaphore std::counting_semaphore, std::binary_semaphore 201907L <semaphore> (C++20)
__cpp_lib_shared_mutex std::shared_mutex (безвременной) 201505L <shared_mutex> (C++17)
__cpp_lib_shared_ptr_arrays std::shared_ptr 201611L <memory> (C++17)
Поддержка массива std::make_shared 201707L <memory> (C++20)
__cpp_lib_shared_ptr_weak_type shared_ptr::weak_type 201606L <memory> (C++17)
__cpp_lib_shared_timed_mutex std::shared_timed_mutex 201402L <shared_mutex> (C++14)
__cpp_lib_shift std::shift_left и std::shift_right 201806L <algorithm> (C++20)
__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)
__cpp_lib_source_location Сбор информации об исходном коде (std::source_location) 201907L <source_location> (C++20)
__cpp_lib_span std::span 202002L <span> (C++20)
__cpp_lib_ssize std::ssize и беззнаковый std::span::size 201902L <iterator> (C++20)
__cpp_lib_stacktrace Библиотека Stacktrace 202011L <stacktrace> (C++23)
__cpp_lib_starts_ends_with Проверка префикса и суффикса строки (std::string_view::starts_with и std::string_view::ends_with для std::string и std::string_view) 201711L <string> <string_view> (C++20)
__cpp_lib_stdatomic_h Заголовок совместимости для атомарных операций C 202011L <stdatomic.h> (C++23)
__cpp_lib_string_contains Функции contains объектов std::basic_string и std::basic_string_view 202011L <string>