c++ - 使用 decltype 和\或 std::remove_reference 调用析构函数

标签 c++ c++11 std destructor decltype

是否可以使用 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/

相关文章:

c++ - 我是否需要内存屏障来访问由完成的线程修改的内存?

c++ - CLICK 模块的 cpp 语法

c++ - std::array<T, N> 的大小是否保证等于 T[N] 的大小?

c++ - decltype(constexpr 变量)

c - 在 'c' 程序中使用 gcc/g++ 在 stdc++ 中编译时出现问题

c++ - 在 C++ 中仅使用 std::string 而不是 char 数组和 std::vector/list 而不是数组是否有任何实际限制?

c++ - 将 double 类型值相乘会在输出中给出随机/垃圾答案

c++ - 在使用 C++ Square 类时遇到问题。成员函数实现和声明

C++,优先队列,项目不排序

c++ - 比较 2 个 int 长度 C++