Spec-Zone.ru › C++

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)
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++.

Отчёт об ошибке Применён к Опубликованное поведение Корректное поведение
LWG 2049 C++11 спецификацию было невозможно завершить из-за фиктивной обёрточной структуры спецификация завершена

См. также

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

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

Spec-Zone.ru

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