3

这个问题与:C++: Explicitly call destructor of template parameter's typedef有关:

我有以下内容:

class A {
public:
  typedef std::shared_ptr<A> Ptr;
  …
};

后来,我通过placement new获得了一个ptr类型的变量A::Ptr *,基本上是通过调用这样的函数:

A::Ptr * f(A::Ptr obj) {
  void * placement = get_legacy_storage(sizeof(obj));
  return new(placement) A::Ptr(obj);
}

我现在想通过显式的析构函数调用撤消placement-new。我这样做:

ptr->A::Ptr::~Ptr();

正如对链接问题的答案的评论中所说,这适用于 gcc,但不适用于 clang。§ 12.4p13 标准说

在显式析构函数调用中,析构函数名称显示为 ~ 后跟表示析构函数的类类型的类型名称decltype 说明符。

但我不确定这如何与 typedef 和范围解析相互作用。所以,我的问题是:

  1. 在上述情况下显式调用析构函数的符合 C++-11 标准的方法是什么(理想情况下不透露 的类型Ptr)?
  2. 1 的答案在 gcc 和/或 clang 中有效吗?如果没有,普遍接受的解决方法是什么?
4

0 回答 0