Spec-Zone.ru › C++

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)
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> {};

Примечания

Во многих реализациях 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 <iostream>
#include <type_traits>
 
struct Ex1
{
    std::string str; // member has a non-trivial default ctor
};
 
struct Ex2
{
    int n;
    Ex2() = default; // trivial and non-throwing
};
 
int main()
{
    std::cout << std::boolalpha
              << "Ex1 is default-constructible? "
              << std::is_default_constructible<Ex1>::value << '\n'
              << "Ex1 is trivially default-constructible? "
              << std::is_trivially_default_constructible<Ex1>::value << '\n'
              << "Ex2 is trivially default-constructible? "
              << std::is_trivially_default_constructible<Ex2>::value << '\n'
              << "Ex2 is nothrow default-constructible? "
              << std::is_nothrow_default_constructible<Ex2>::value << '\n';
}

Вывод:

Ex1 is default-constructible? true
Ex1 is trivially default-constructible? false
Ex2 is trivially default-constructible? true
Ex2 is nothrow default-constructible? true

См. также

is_constructibleis_trivially_constructibleis_nothrow_constructible
(C++11)(C++11)(C++11)
проверяет, есть ли у типа конструктор для определённых аргументов
(шаблон класса)
is_copy_constructibleis_trivially_copy_constructibleis_nothrow_copy_constructible
(C++11)(C++11)(C++11)
проверяет, есть ли у типа конструктор копирования
(шаблон класса)
is_move_constructibleis_trivially_move_constructibleis_nothrow_move_constructible
(C++11)(C++11)(C++11)
проверяет, может ли тип быть создан из ссылки на rvalue
(шаблон класса)
default_initializable
(C++20)
определяет, что объект типа может быть создан по умолчанию
(концепция)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/types/is_default_constructible

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API