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 > inline constexpr bool is_destructible_v = is_destructible<T>::value; | (с C++17) | |
template< class T > inline constexpr bool is_trivially_destructible_v = is_trivially_destructible<T>::value; | (с C++17) | |
template< class T > inline 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++, не выбрасывают исключения.
Память, занимаемая тривиально разрушаемыми объектами может быть повторно использована без вызова деструктора.
Пример
#include <iostream>
#include <string>
#include <type_traits>
struct Foo
{
std::string str;
~Foo() noexcept {};
};
struct Bar
{
~Bar() = default;
};
int main()
{
std::cout << std::boolalpha
<< "std::string is destructible? "
<< std::is_destructible<std::string>::value << '\n'
<< "Foo is trivially destructible? "
<< std::is_trivially_destructible_v<Foo> << '\n'
<< "Foo is nothrow destructible? "
<< std::is_nothrow_destructible<Foo>() << '\n'
<< "Bar is trivially destructible? "
<< std::is_trivially_destructible<Bar>{} << '\n';
}Вывод:
std::string is destructible? true Foo is trivially destructible? false Foo is nothrow destructible? true Bar is trivially destructible? true
Отчеты об ошибках
Следующие отчеты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применено к | Поведение как опубликовано | Правильное поведение |
|---|---|---|---|
| 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/w/cpp/types/is_destructible