例如,我们有这样的功能:
template <typename TYPE>
void construct_and_destruct(TYPE & object)
{
//...
}
我们 cant 调用构造函数和析构函数,如object.Type()
和object.~Type()
(现在不是)(为什么? = C )
要调用构造函数,我们可以new(&object) TYPE()
。我不知道如何调用析构函数(没有存在的位置delete
)。怎么做?
答案 0 :(得分:4)
您可以将析构函数称为:
object.~TYPE();
但它可能不是您想要的,并且需要进行双重删除。
构造函数非常简单:
object = TYPE();
答案 1 :(得分:1)
object.~TYPE()
和object.~TYPE::TYPE()
都是正确的。然而,听起来有点可疑,你想要实现什么目标?
答案 2 :(得分:0)
试试这个 Calling destructor with decltype and\or std::remove_reference,它对我来说调用非限定类型的析构函数(模板参数中未指定的内部类)...
答案 3 :(得分:0)
我遇到了一个略有不同的问题,但也是为了放置新/删除,解决方案应该是相似的。
给定一个依赖类型名称,展示位置新:
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();
}
看起来不错。