这个问题与:C++: Explicitly call destructor of template parameter's typedef
我有以下内容:
class A {
public:
typedef std::shared_ptr<A> Ptr;
…
};
稍后,我有一个类型为ptr
的变量A::Ptr *
,该变量是通过放置new获得的,基本上是通过调用如下函数来实现的:
A::Ptr * f(A::Ptr obj) {
void * placement = get_legacy_storage(sizeof(obj));
return new(placement) A::Ptr(obj);
}
我现在想用一个明确的析构函数调用来撤消新的placement。我是这样的:
ptr->A::Ptr::~Ptr();
如对链接问题的答案的评论中所述,此方法适用于gcc,但不适用于clang。该标准的第12.4p13条说
在显式析构函数调用中,析构函数名称显示为〜,后跟表示析构函数的类类型的 type-name 或 decltype-specifier 。
但是我不确定它如何与typedef和作用域解析交互。 所以,我的问题是:
Ptr
类型的情况下,显式调用析构函数的符合C ++-11标准的方法是什么?