使用decltype明确地销毁指向对象

时间:2016-07-23 10:47:05

标签: c++ c++11

我有:

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();

但是,我很困惑为什么这是必要的。

2 个答案:

答案 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);