这个问题与: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 和范围解析相互作用。所以,我的问题是:
- 在上述情况下显式调用析构函数的符合 C++-11 标准的方法是什么(理想情况下不透露 的类型
Ptr
)? - 1 的答案在 gcc 和/或 clang 中有效吗?如果没有,普遍接受的解决方法是什么?