所以我一直在尝试实现一个变体/标记的联合类,并且需要一种方法来编写通用析构函数并犯了我认为是一个愚蠢的错误,忘记了某些类型没有析构函数,做类似的事情
template<typename T>
void destruct(T& thing) {
thing.~T();
}
Run Code Online (Sandbox Code Playgroud)
然而,即使对于没有析构函数的类型,如int或,这也能正常工作struct A {int b;};。我仍然认为使用这样的东西更具可读性和更容易推理
template<typename T>
void destruct(T& thing) {
if constexpr(std::is_destructible<T>::value) {
thing.~T();
}
}
Run Code Online (Sandbox Code Playgroud)
但是代码之间实际上有什么区别吗?第一个感觉非常不确定的行为/对我来说是错误的。
然而,即使对于没有析构函数的类型,如 int 或 struct A {int b;}; 这也能正常工作。
这些是可简单破坏的类型的示例。调用它们的“析构函数”是明确定义的。它没有任何影响。
但是代码之间实际上有什么区别吗?
仅适用于不可破坏的类型。平凡可破坏的类型是可破坏的。
对于不可破坏的类型,例如void、函数类型或带有~T() = delete;的类型,第一个函数是病态的,而后者是空体的良态。这取决于哪个用例更有用,但默默无视试图破坏不可破坏的东西对我来说似乎很可疑。