我有:
T* p;
我想做:
p->~decltype(*p)();
然而,它不起作用。
p->~T();
确实有效,但如果可能的话,它喜欢使用decltype()
。
错误讯息:
error: expected class-name before 'decltype'
编辑:用例
我试图避免使用VLA为堆栈上分配的数组使用数组的alloca + placement new。放置new之后,需要显式销毁堆栈数组中的对象。我知道如何解决问题,我可以做到:
using T = ::std::remove_reference_t<decltype(*p)>;
p->~T();
但是,我很困惑为什么这是必要的。
答案 0 :(得分:6)
你误解了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();
}
答案 1 :(得分:3)
如下:
template<typename T>
void call_destructor(T* obj)
{
obj->~T();
}
可以使用如下:
SomeClass* p = new SomeClass();
<...>
call_destructor(p);