std::is_default_constructible, std::is_trivially_default_constructible, std::is_nothrow_default_constructible
Определено в заголовочном файле <type_traits> | ||
template<class T > struct is_default_constructible; | (1) | (начиная с C++11) |
template<class T > struct is_trivially_default_constructible; | (2) | (начиная с C++11) |
template<class T > struct is_nothrow_default_constructible; | (3) | (начиная с C++11) |
T
должен быть полным типом, (возможно, cv-квалифицированным) void или массивом с неизвестной границей. Иначе поведение не определено.
Если реализация приведённого выше шаблона прямо или косвенно зависит от неполного типа, и эта реализация могла бы дать другой результат, если бы этот тип был гипотетически завершён, поведение не определено.
Поведение программы, добавляющей специализации для любых шаблонов, описанных на этой странице не определено.
Содержание |
[править]Вспомогательные шаблонные переменные
template<class T > inlineconstexprbool is_default_constructible_v = | (начиная с C++17) | |
template<class T > inlineconstexprbool is_trivially_default_constructible_v = | (начиная с C++17) | |
template<class T > inlineconstexprbool is_nothrow_default_constructible_v = | (начиная с 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> |
[править]Возможная реализация
template<class T>struct is_default_constructible :std::is_constructible<T>{}; template<class T>struct is_trivially_default_constructible :std::is_trivially_constructible<T>{}; template<class T>struct is_nothrow_default_constructible :std::is_nothrow_constructible<T>{}; |
[править]Примечание
Во многих реализациях std::is_nothrow_default_constructible
также проверяет вызывает ли деструктор исключение или нет, потому что фактически это noexept(T()). То же самое относится к std::is_trivially_default_constructible
, которое в этих реализациях также требует, чтобы деструктор был тривиальным: Ошибка GCC 51452, LWG проблема 2116.
std::is_default_constructible<T> не проверяет, будет ли компилироваться T x;; оно пытается инициализировать напрямую с пустым списком аргументов (смотрите std::is_constructible). Таким образом, std::is_default_constructible_v<constint> и std::is_default_constructible_v<constint[10]> равны true.
[править]Пример
#include <iostream>#include <type_traits> struct Ex1 {std::string str;// Элемент имеет нетривиальный конструктор по умолчанию};struct Ex2 {int n; Ex2()=default;// Тривиальный и не вызывающий исключения конструктор}; int main(){std::cout<<std::boolalpha<<"Ex1 конструируется по умолчанию? "<< std::is_default_constructible<Ex1>::value<<'\n'<<"Ex1 тривиально конструируется по умолчанию? "<< std::is_trivially_default_constructible<Ex1>::value<<'\n'<<"Ex2 тривиально конструируется по умолчанию? "<< std::is_trivially_default_constructible<Ex2>::value<<'\n'<<"Ex2 конструируется по умолчанию без исключений? "<< std::is_nothrow_default_constructible<Ex2>::value<<'\n';}
Вывод:
Ex1 конструируется по умолчанию? true Ex1 тривиально конструируется по умолчанию? false Ex2 тривиально конструируется по умолчанию? true Ex2 конструируется по умолчанию без исключений? true
[править]Смотрите также
(C++11)(C++11)(C++11) | проверяет, есть ли у типа конструктор для определённых аргументов (шаблон класса) |
(C++11)(C++11)(C++11) | проверяет, есть ли у типа конструктор копирования (шаблон класса) |
(C++11)(C++11)(C++11) | проверяет, может ли тип быть сконструирован из правосторонней ссылки (шаблон класса) |
(C++20) | указывает, что объект типа может быть сконструирован по умолчанию (концепт) |