我有:
T* p;
我想做的是:
p->~decltype(*p)();
但是,它不起作用。
p->~T();
确实有效,但如果可能的话,它喜欢用 decltype()
来完成。
错误信息:
error: expected class-name before 'decltype'
编辑:用例
我试图避免使用数组的 alloca + placement new 将 VLA 用于在堆栈上分配的数组。放置new之后,需要显式销毁栈数组中的对象。我知道如何解决问题,我能做到:
using T = ::std::remove_reference_t<decltype(*p)>;
p->~T();
但是,我很困惑为什么这是必要的。
最佳答案
你误解了 decltype
。伪析构函数调用需要非引用类型。
试试这个:
int * p = new int;
p->~decltype(declprval<decltype(*p)>())();
这是使用:
template <typename T> std::decay_t<T> declprval();
从 decltype-specifier 中获取表达式的衰减类型是一项艰巨的工作。在“真实代码”中,我只是使用:
int * p = new int;
{
using T = std::remove_reference_t<decltype(*p)>;
p->~T();
}
关于c++ - 使用 decltype 显式销毁指向的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38540882/