C++标准定义的Cpp17Destructible是否有可用的检查特性?
关于Cpp17Destructible特性检查的trait问题
C++标准定义了Cpp17Destructible特性,请问代码中是否存在可用于正确检查该特性的标准trait?
std::is_destructible似乎无法实现正确的检查,比如以下代码可以正常编译:
#include <type_traits> static_assert(std::is_destructible_v<int>); using f_ptr = int(*)(int); static_assert(std::is_destructible_v<f_ptr>); static_assert(std::is_destructible_v<int[4]>);
解答
首先明确:C++标准库中没有直接对应Cpp17Destructible的trait,std::is_destructible的判定逻辑和Cpp17Destructible的要求存在本质差异:
Cpp17Destructible的核心要求是:类型的析构操作(显式或隐式声明的析构函数)必须合法、可访问,且调用不会触发未定义行为。但std::is_destructible的判定范围要宽泛得多——它会对标量类型(如int)、函数指针、数组类型返回true,而这些类型根本不存在析构函数,显然不符合Cpp17Destructible的定义。
如果需要精确检查Cpp17Destructible特性,你需要自定义trait,大致实现思路:
- 先排除标量、数组、函数指针等非类/非联合类型;
- 用
std::is_class或std::is_union筛选出类/联合类型; - 再结合
std::is_destructible(以及std::is_nothrow_destructible,如果需要noexcept保证)验证析构函数的合法性。
简单的自定义trait示例:
#include <type_traits> template<typename T> struct is_cpp17_destructible : std::false_type {}; template<typename T> requires (std::is_class_v<T> || std::is_union_v<T>) && std::is_destructible_v<T> struct is_cpp17_destructible<T> : std::true_type {}; template<typename T> constexpr bool is_cpp17_destructible_v = is_cpp17_destructible<T>::value;
内容的提问来源于stack exchange,提问作者jbcoe
相关产品推荐
相关产品推荐

