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

std::is_default_constructible, std::is_trivially_default_constructible, std::is_nothrow_default_constructible

Материал из cppreference.com
< cpp‎ | types
 
 
Библиотека метапрограммирования
Свойства типов
Категории типов
(C++11)
(C++14)  
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Свойства типов
(C++11)
(C++11)
(C++14)
(C++11)
(C++11)(до C++20*)
(C++11)(устарело в C++20)
(C++11)
Константы свойств типа
Метафункции
(C++17)
Поддерживаемые операции
is_default_constructibleis_trivially_default_constructibleis_nothrow_default_constructible
(C++11)(C++11)(C++11)
Запросы отношений и свойств
Модификации типов
Преобразования типов
(C++11)(устарело в C++23)
(C++11)(устарело в C++23)
(C++11)
(C++11)
(C++17)

(C++11)(до C++20*)(C++17)
Рациональная арифметика времени компиляции
Целочисленные последовательности времени компиляции
 
Определено в заголовочном файле <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)
1) Предоставляет константу элемент value, равную std::is_constructible<T>::value.
2) Предоставляет константу элемент value, равную std::is_trivially_constructible<T>::value.
3) Предоставляет константу элемент value, равную std::is_nothrow_constructible<T>::value.

T должен быть полным типом, (возможно, cv-квалифицированным) void или массивом с неизвестной границей. Иначе поведение не определено.

Если реализация приведённого выше шаблона прямо или косвенно зависит от неполного типа, и эта реализация могла бы дать другой результат, если бы этот тип был гипотетически завершён, поведение не определено.

Поведение программы, добавляющей специализации для любых шаблонов, описанных на этой странице не определено.

Содержание

[править]Вспомогательные шаблонные переменные

template<class T >

inlineconstexprbool is_default_constructible_v =

    is_default_constructible<T>::value;
(начиная с C++17)
template<class T >

inlineconstexprbool is_trivially_default_constructible_v =

    is_trivially_default_constructible<T>::value;
(начиная с C++17)
template<class T >

inlineconstexprbool is_nothrow_default_constructible_v =

    is_nothrow_default_constructible<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_typebool
typestd::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

[править]Смотрите также

проверяет, есть ли у типа конструктор для определённых аргументов
(шаблон класса)[править]
проверяет, есть ли у типа конструктор копирования
(шаблон класса)[править]
проверяет, может ли тип быть сконструирован из правосторонней ссылки
(шаблон класса)[править]
указывает, что объект типа может быть сконструирован по умолчанию
(концепт)[править]
close