例如,我们有一个这样的函数:
template <typename TYPE>
void construct_and_destruct(TYPE & object)
{
//...
}
我们不能object.Type()
像and一样调用构造函数和析构函数object.~Type()
(现在不是真的)(为什么?=C)
要调用我们可以喜欢的构造函数new(&object) TYPE()
。而且我不知道如何调用析构函数(不存在放置delete
)。这个怎么做?
例如,我们有一个这样的函数:
template <typename TYPE>
void construct_and_destruct(TYPE & object)
{
//...
}
我们不能object.Type()
像and一样调用构造函数和析构函数object.~Type()
(现在不是真的)(为什么?=C)
要调用我们可以喜欢的构造函数new(&object) TYPE()
。而且我不知道如何调用析构函数(不存在放置delete
)。这个怎么做?
您可以将析构函数称为:
object.~TYPE();
但这可能不是您想要的,并且可能会被双重删除。
构造函数很简单:
object = TYPE();
object.~TYPE()
object.~TYPE::TYPE()
我认为都是正确的。听起来有点可疑,但是,您要实现什么目标?
我遇到了一个稍微不同的问题,但也适用于放置新/删除,解决方案应该是相似的。
给定一个依赖类型名称,放置新:
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();
}
看起来不错。
试试这个带有 decltype 和\或 std::remove_reference 的调用析构函数,它对我来说可以调用非限定类型的析构函数(模板参数中未指定的内部类)......