c++ - 使用 decltype 显式销毁指向的对象

标签 c++ c++11

我有:

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/

相关文章:

c++ - 删除单向链表的列表

C# 包装器 如何

c++ - 使用 C++ 输出运算符打印前导零?

c++ - 在非常大的文本中搜索多个字符串

c++ - SFINAE 在评估模板参数中的 constexpr 时失败?

c++ - 带菜单的生日悖论分配 (C++)

c++ - 我想在 C++ 中创建内部类的对象,或者可能是嵌套类

c++ - 添加 `noexcept(false)` 是否对代码有任何好处?

c++ - 在每个源文件中替代 "extern template"

c++ - 类违反三(五)规则时的编译器警告