Bootstrap

C++标准模板(STL)- 概念库 (C++20) - 指定能销毁该类型的对象 - (std::destructible)

概念库提供基础语言概念的定义,它们能用于进行模板实参的编译时校验,以及基于类型属性的函数派发。这些概念在程序中提供等式推理的基础。

标准库中的大多数概念一同加上了语法及语义要求。通常,编译器只能检查语法要求。若在使用点语义要求未得到满足,则程序为病式,不要求诊断。

类型支持(基本类型、RTTI、类型特性)

指定能销毁该类型的对象

std::destructible

定义于头文件 <concepts>

template < class T >
concept destructible = std::is_nothrow_destructible_v<T>;

(C++20 起)

概念 destructible 指定能在实例生存期结尾安全销毁的所有类型(包含引用类型)的概念。

注意

不同于 可析构 (Destructible) 具名要求, std::destructible 要求析构函数为 noexcept(true) ,而不仅是调用时不抛出,并且允许引用类型和数组类型。

参阅

is_destructible

is_trivially_destructible

is_nothrow_destructible

(C++11)

检查类型是否拥有未被弃置的析构函数
(类模板)

 

调用示例

#include <iostream>
#include <type_traits>

class E
{
public:
    template<class T> E(T&&) { }
};

class A {};

class B : public A {};

class C {};

class D
{
public:
    operator C()
    {
        return c;
    }  C c;
};

namespace std
{
template< class T >
const bool is_nothrow_destructible_v = is_nothrow_destructible<T>::value;

template < class T >
const bool destructible = is_nothrow_destructible<T>::value;
}

int main()
{
    std::cout << std::boolalpha;

    std::cout << "std::is_nothrow_destructible<A>::value:       "
              << std::is_nothrow_destructible<A>::value << std::endl;
    std::cout << "std::is_nothrow_destructible<B>::value:       "
              << std::is_nothrow_destructible<B>::value << std::endl;
    std::cout << "std::is_nothrow_destructible<C>::value:       "
              << std::is_nothrow_destructible<C>::value << std::endl;
    std::cout << "std::is_nothrow_destructible<D>::value:       "
              << std::is_nothrow_destructible<D>::value << std::endl;
    std::cout << "std::is_nothrow_destructible<E>::value:       "
              << std::is_nothrow_destructible<E>::value << std::endl;
    std::cout << "std::is_nothrow_destructible<float>::value:   "
              << std::is_nothrow_destructible<float>::value << std::endl;
    std::cout << "std::is_nothrow_destructible<int>::value:     "
              << std::is_nothrow_destructible<int>::value << std::endl;
    std::cout << "std::is_nothrow_destructible<bool>::value:    "
              << std::is_nothrow_destructible<bool>::value << std::endl;

    std::cout << "-----------------------------------------------" << std::endl;
    std::cout << std::endl;

    std::cout << "std::is_nothrow_destructible_v<A>:       "
              << std::is_nothrow_destructible_v<A> << std::endl;
    std::cout << "std::is_nothrow_destructible_v<B>:       "
              << std::is_nothrow_destructible_v<B> << std::endl;
    std::cout << "std::is_nothrow_destructible_v<C>:       "
              << std::is_nothrow_destructible_v<C> << std::endl;
    std::cout << "std::is_nothrow_destructible_v<D>:       "
              << std::is_nothrow_destructible_v<D> << std::endl;
    std::cout << "std::is_nothrow_destructible_v<E>:       "
              << std::is_nothrow_destructible_v<E> << std::endl;
    std::cout << "std::is_nothrow_destructible_v<float>:   "
              << std::is_nothrow_destructible_v<float> << std::endl;
    std::cout << "std::is_nothrow_destructible_v<int>:     "
              << std::is_nothrow_destructible_v<int> << std::endl;
    std::cout << "std::is_nothrow_destructible_v<bool>:    "
              << std::is_nothrow_destructible_v<bool> << std::endl;
    std::cout << std::endl;

    std::cout << "-----------------------------------------------" << std::endl;
    std::cout << std::endl;

    std::cout << "std::destructible<A>:       "
              << std::destructible<A> << std::endl;
    std::cout << "std::destructible<B>:       "
              << std::destructible<B> << std::endl;
    std::cout << "std::destructible<C>:       "
              << std::destructible<C> << std::endl;
    std::cout << "std::destructible<D>:       "
              << std::destructible<D> << std::endl;
    std::cout << "std::destructible<E>:       "
              << std::destructible<E> << std::endl;
    std::cout << "std::destructible<float>:   "
              << std::destructible<float> << std::endl;
    std::cout << "std::destructible<int>:     "
              << std::destructible<int> << std::endl;
    std::cout << "std::destructible<bool>:    "
              << std::destructible<bool> << std::endl;
    std::cout << std::endl;

    return 0;
}

输出

std::is_nothrow_destructible<A>::value:       true
std::is_nothrow_destructible<B>::value:       true
std::is_nothrow_destructible<C>::value:       true
std::is_nothrow_destructible<D>::value:       true
std::is_nothrow_destructible<E>::value:       true
std::is_nothrow_destructible<float>::value:   true
std::is_nothrow_destructible<int>::value:     true
std::is_nothrow_destructible<bool>::value:    true
-----------------------------------------------

std::is_nothrow_destructible_v<A>:       true
std::is_nothrow_destructible_v<B>:       true
std::is_nothrow_destructible_v<C>:       true
std::is_nothrow_destructible_v<D>:       true
std::is_nothrow_destructible_v<E>:       true
std::is_nothrow_destructible_v<float>:   true
std::is_nothrow_destructible_v<int>:     true
std::is_nothrow_destructible_v<bool>:    true

-----------------------------------------------

std::destructible<A>:       true
std::destructible<B>:       true
std::destructible<C>:       true
std::destructible<D>:       true
std::destructible<E>:       true
std::destructible<float>:   true
std::destructible<int>:     true
std::destructible<bool>:    true

;