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.std::remove_all_extents<T>::type является либо неклассовым типом, либо типом класса с тривиальным деструктором.Если 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 | спецификацию было невозможно завершить из-за фиктивной обёрточной структуры | спецификация завершена |
См. также
|
(C++11)(C++11)(C++11) | проверяет, имеет ли тип конструктор для заданных аргументов (шаблон класса) |
|
(C++11) | проверяет, имеет ли тип виртуальный деструктор (шаблон класса) |
|
(C++20) | задаёт требование, согласно которому объект типа может быть уничтожен (концепт) |
| деструктор | освобождает занятые ресурсы |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/types/is_destructible