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) |
value, равную std::is_constructible<T>::value.value, равную std::is_trivially_constructible<T>::value.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 51452, проблема LWG 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; // member has a non-trivial default constructor
};
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; // trivial and non-throwing
};
static_assert(std::is_trivially_default_constructible_v<S2> == true);
static_assert(std::is_nothrow_default_constructible_v<S2> == true);
int main() {}
См. также
|
(C++11)(C++11)(C++11) | проверяет, есть ли у типа конструктор для заданных аргументов (шаблон класса) |
|
(C++11)(C++11)(C++11) | проверяет, есть ли у типа конструктор копирования (шаблон класса) |
|
(C++11)(C++11)(C++11) | проверяет, можно ли сконструировать тип из rvalue-ссылки (шаблон класса) |
|
(C++20) | задаёт требование, что объект типа можно сконструировать по умолчанию (концепт) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/types/is_default_constructible