Namespaces
Variants

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

From cppreference.net
Metaprogramming library
Type traits
Type categories
(C++11)
(C++11) ( DR* )
Type properties
(C++11)
(C++11)
(C++14)
(C++11) (deprecated in C++26)
(C++11) ( until C++20* )
(C++11) (deprecated in C++20)
(C++11)
Type trait constants
Metafunctions
(C++17)
Supported operations
is_default_constructible is_trivially_default_constructible is_nothrow_default_constructible
(C++11) (C++11) (C++11)
Relationships and property queries
Type modifications
Type transformations
(C++11) (deprecated in C++23)
(C++11) (deprecated in C++23)
(C++11)
(C++11) ( until C++20* ) (C++17)

Compile-time rational arithmetic
Compile-time integer sequences
Определено в заголовочном файле <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 >

inline constexpr bool is_default_constructible_v =

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

inline constexpr bool is_trivially_default_constructible_v =

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

inline constexpr bool is_nothrow_default_constructible_v =

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

Унаследовано от std:: integral_constant

Константы-члены

value
[static]
true если T является конструируемым по умолчанию, false в противном случае
(публичная статическая константа-член)

Функции-члены

operator bool
преобразует объект в bool , возвращает value
(публичная функция-член)
operator()
(C++14)
возвращает value
(публичная функция-член)

Типы-члены

Тип Определение
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> {};
**Примечание:** Весь код C++ внутри тегов `
` был сохранен без изменений, как и требовалось. HTML-теги и атрибуты также остались нетронутыми. Поскольку в предоставленном фрагменте не было текста вне тегов ``, `
` или `` для перевода, результат идентичен исходному.

Примечания

Во многих реализациях std::is_nothrow_default_constructible также проверяет, выбрасывает ли деструктор исключения, поскольку это фактически noexcept ( T ( ) ) . То же относится и к std::is_trivially_default_constructible , который в этих реализациях также требует, чтобы деструктор был тривиальным: GCC bug 51452 , LWG issue 2116 .

std :: is_default_constructible < T > не проверяет, что T x ; скомпилируется; он выполняет прямую инициализацию с пустым списком аргументов (см. std::is_constructible ). Поэтому std :: is_default_constructible_v < const int > и std :: is_default_constructible_v < const int [ 10 ] > имеют значение true .

Пример

#include <string>
#include <type_traits>
struct S1
{
    std::string str; // член имеет нетривиальный конструктор по умолчанию
};
static_assert(std::is_default_constructible_v<S1> == true);
static_assert(std::is_trivially_default_constructible_v<S1> == false);
struct S2
{
    int n;
    S2() = default; // тривиальный и не выбрасывающий исключения
};
static_assert(std::is_trivially_default_constructible_v<S2> == true);
static_assert(std::is_nothrow_default_constructible_v<S2> == true);
int main() {}

Смотрите также

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