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 >
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
См. также
|
(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/w/cpp/types/is_default_constructible