Макросы проверки возможностей (начиная с 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 |