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

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