是否可以使用 decltype 和\或 std::remove_reference 来调用析构函数(无需操作符 delete)?这是一个例子:
#include <iostream>
#include <type_traits>
using namespace std;
class Test
{
public:
Test() {}
virtual ~Test() {}
};
int main()
{
Test *ptr;
ptr->~Test(); // works
ptr->~decltype(*ptr)(); // doesn't work
ptr->~std::remove_reference<decltype(*ptr)>::type(); // doesn't work
return 0;
}
最佳答案
当您只有限定类型名称时,您可以使用别名模板来获取非限定类型名称。以下应该有效
template<typename T> using alias = T;
ptr->~alias<std::remove_reference<decltype(*ptr)>::type>();
请注意,如果 remove_reference
起作用,它仍然是危险的,因为通过限定类型名称,您将禁止虚拟析构函数调用。通过使用别名模板,虚拟析构函数仍然有效。
请注意 GCC4.8 似乎接受
ptr->std::remove_reference<decltype(*ptr)>::type::~type();
Clang 拒绝了这一点。我早就放弃了尝试了解析构函数名称查找的工作原理(如果你查看 clang 源代码,你会注意到 clang 开发人员也不遵循规范,因为他们说这在这里没有意义)。存在涵盖析构函数调用语法及其困惑情况的 DR。因此,我建议不要在这里使用任何复杂的语法。
关于c++ - 使用 decltype 和\或 std::remove_reference 调用析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17328454/