Namespaces
Variants

std:: is_destructible, std:: is_trivially_destructible, std:: is_nothrow_destructible

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_destructible is_trivially_destructible is_nothrow_destructible
(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_destructible ;
(1) (начиная с C++11)
template < class T >
struct is_trivially_destructible ;
(2) (начиная с C++11)
template < class T >
struct is_nothrow_destructible ;
(3) (начиная с C++11)
1) Если T является ссылочным типом, предоставляет константу-член value равную true .
Если T является (возможно cv-квалифицированным) void , типом функции или массивом неизвестной границы, value равно false .
Если T является объектным типом, тогда для типа U , который является std:: remove_all_extents < T > :: type , если выражение std:: declval < U & > ( ) .~U ( ) корректно в невычисляемом контексте, value равно true . В противном случае, value равно false .
2) То же, что и (1) и дополнительно std:: remove_all_extents < T > :: type является либо не-классовым типом, либо классовым типом с тривиальным деструктором .
3) То же, что и (1) , но деструктор является noexcept .

Если 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 спецификация была невыполнимой из-за воображаемой обертывающей структуры сделана завершенной

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

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