4

例如,我们有一个这样的函数:

template <typename TYPE>
void construct_and_destruct(TYPE & object)
{
    //...
}

我们不能object.Type()像and一样调用构造函数和析构函数object.~Type()(现在不是真的)(为什么?=C

要调用我们可以喜欢的构造函数new(&object) TYPE()。而且我不知道如何调用析构函数(不存在放置delete)。这个怎么做?

4

4 回答 4

6

您可以将析构函数称为:

object.~TYPE();

但这可能不是您想要的,并且可能会被双重删除。

构造函数很简单:

object = TYPE();
于 2012-11-03T15:50:40.823 回答
1

object.~TYPE()object.~TYPE::TYPE()我认为都是正确的。听起来有点可疑,但是,您要实现什么目标?

于 2012-11-03T15:50:52.913 回答
1

我遇到了一个稍微不同的问题,但也适用于放置新/删除,解决方案应该是相似的。

给定一个依赖类型名称,放置新:

new (&foo) typename AT::T(arg, arg, arg);

相关的删除很棘手:

foo.~ typename AT::T();  // Doesn't work, nor do variations of syntax

现代解决方案似乎是,std::destroy_at(&foo)但我的编译器没有完整的 C++17。但是,滚动您自己的基本版本并不困难:

template <typename T>
constexpr void destroy_at(T* p)
{
  p->~T();
}

看起来不错。

于 2021-01-14T20:57:09.220 回答
0

试试这个带有 decltype 和\或 std::remove_reference 的调用析构函数,它对我来说可以调用非限定类型的析构函数(模板参数中未指定的内部类)......

于 2021-01-14T16:20:33.280 回答