std::is_aggregate
Материал из cppreference.com
Определено в заголовочном файле <type_traits> | ||
template<class T > struct is_aggregate; | (начиная с C++17) | |
std::is_aggregate
является UnaryTypeTrait.
Если T
является агрегатным типом, предоставляет константу-элемент value
, равную true. Для любого другого типа value
равна false.
Если T
является неполным типом, отличным от типа массива или (возможно, cv-квалифицированным) void, поведение не определено.
Поведение программы, добавляющей специализации для std::is_aggregate
или std::is_aggregate_v
не определено.
Содержание |
[править]Параметры шаблона
T | — | тип для проверки |
[править]Шаблон вспомогательной переменной
template<class T > inlineconstexprbool is_aggregate_v = is_aggregate<T>::value; | (начиная с C++17) | |
Унаследован от std::integral_constant
Константы элементы
value [static] | true, если T агрегатный тип, false иначе (public static константа-элемент) |
Функции-элементы
operator bool | преобразует объект в bool, возвращает value (public функция-элемент) |
operator() (C++14) | возвращает value (public функция-элемент) |
Типы элементы
Тип | Определение |
value_type | bool |
type | std::integral_constant<bool, value> |
[править]Примечание
Макрос Тестирования функциональности | Значение | Стандарт | Функциональность |
---|---|---|---|
__cpp_lib_is_aggregate | 201703L | (C++17) | std::is_agregate |
[править]Пример
Запустить этот код
#include <new>#include <type_traits>#include <utility> // строит T в неинициализированной памяти, на которую указывает p, используя// инициализацию списком для агрегатов и инициализацию не списком иначеtemplate<class T, class... Args> T* construct(T* p, Args&&... args){ifconstexpr(std::is_aggregate_v<T>){return::new(static_cast<void*>(p)) T{std::forward<Args>(args)...};}else{return::new(static_cast<void*>(p)) T(std::forward<Args>(args)...);}} struct A {int x, y;};struct B { B(int, constchar*){}}; int main(){std::aligned_union_t<1, A, B> storage;[[maybe_unused]] A* a = construct(reinterpret_cast<A*>(&storage), 1, 2);[[maybe_unused]] B* b = construct(reinterpret_cast<B*>(&storage), 1, "привет");}
[править]Отчёты о дефектах
Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:
Номер | Применён | Поведение в стандарте | Корректное поведение |
---|---|---|---|
LWG 3823 | C++17 | Поведение не определено, если T является типом массива, аstd::remove_all_extents_t<T> является неполным типом. | Поведение определяется независимо от неполноты std::remove_all_extents_t<T> , если T является типом массива. |