Макросы проверки возможностей (начиная с C++20)
Стандарт определяет набор макросов препроцессора, соответствующих языку 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 |