std:: is_destructible, std:: is_trivially_destructible, std:: is_nothrow_destructible
|
Определено в заголовочном файле
<type_traits>
|
||
|
template
<
class
T
>
struct is_destructible ; |
(1) | (начиная с C++11) |
|
template
<
class
T
>
struct is_trivially_destructible ; |
(2) | (начиная с C++11) |
|
template
<
class
T
>
struct is_nothrow_destructible ; |
(3) | (начиная с C++11) |
T
является ссылочным типом, предоставляет константу-член
value
равную
true
.
T
является (возможно cv-квалифицированным)
void
, типом функции или массивом неизвестной границы,
value
равно
false
.
T
является объектным типом, тогда для типа
U
, который является
std::
remove_all_extents
<
T
>
::
type
, если выражение
std::
declval
<
U
&
>
(
)
.~U
(
)
корректно в невычисляемом контексте,
value
равно
true
. В противном случае,
value
равно
false
.
Если
T
не является полным типом, (возможно, с cv-квалификаторами)
void
, или массивом неизвестной границы, поведение не определено.
Если создание экземпляра шаблона выше зависит, прямо или косвенно, от неполного типа, и это создание экземпляра может дать другой результат, если бы этот тип был гипотетически завершен, поведение не определено.
Если программа добавляет специализации для любых шаблонов, описанных на этой странице, поведение не определено.
Содержание |
Вспомогательные шаблоны переменных
|
template
<
class
T
>
constexpr bool is_destructible_v = is_destructible < T > :: value ; |
(начиная с C++17) | |
|
template
<
class
T
>
constexpr bool is_trivially_destructible_v = is_trivially_destructible < T > :: value ; |
(начиная с C++17) | |
|
template
<
class
T
>
constexpr bool is_nothrow_destructible_v = is_nothrow_destructible < 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 > |
Примечания
Поскольку программа на C++ завершается, если деструктор выбрасывает исключение во время раскрутки стека (что обычно невозможно предсказать), все практичные деструкторы не выбрасывают исключения, даже если они не объявлены как noexcept. Все деструкторы, найденные в стандартной библиотеке C++, не выбрасывают исключения.
Память, занятая тривиально разрушаемыми объектами, может быть повторно использована без вызова деструктора.
Возможная реализация
| is_destructible (1) |
|---|
// C++20 required template<typename t> struct is_destructible : std::integral_constant<bool, requires(t object) { object.~t(); }> {}; |
| is_trivially_destructible (2) |
// Not real C++. Shall P2996 be approved, the following implementation will be available: template<typename t> struct is_trivially_destructible : std::integral_constant<bool, std::meta::type_is_trivially_destructible(^t)> {}; |
| is_nothrow_destructible (3) |
// C++20 required template<typename t> struct is_nothrow_destructible : std::integral_constant<bool, requires(t object) { {object.~t()} noexcept; }> {}; |
Пример
#include <iostream> #include <string> #include <type_traits> struct Foo { std::string str; ~Foo() noexcept {}; }; struct Bar { ~Bar() = default; }; static_assert(std::is_destructible<std::string>::value == true); static_assert(std::is_trivially_destructible_v<Foo> == false); static_assert(std::is_nothrow_destructible<Foo>() == true); static_assert(std::is_trivially_destructible<Bar>{} == true); int main() {}
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 2049 | C++11 | спецификация была невыполнимой из-за воображаемой обертывающей структуры | сделана завершенной |
Смотрите также
|
(C++11)
(C++11)
(C++11)
|
проверяет, имеет ли тип конструктор для определенных аргументов
(шаблон класса) |
|
(C++11)
|
проверяет, имеет ли тип виртуальный деструктор
(шаблон класса) |
|
(C++20)
|
указывает, что объект типа может быть уничтожен
(концепт) |
| destructor | освобождает занятые ресурсы |