假设 aclass
包含由嵌套定义的类型,using
其析构函数需要显式调用。是否有必要用于using
创建不包含命名空间分隔符(::
)的本地类型?
在这个人为的例子中,我想调用A::WeakPtr
's 的析构函数,比如:
wp->~A::WeakPtr();
而不是喜欢:
using AWeakPtr = A::WeakPtr;
wp->~AWeakPtr()
这是可行的吗?这是一个完整的例子。
#include <cstdlib>
#include <iostream>
#include <memory>
struct A : std::enable_shared_from_this<A> {
using SharedPtr = std::shared_ptr<A>;
using WeakPtr = std::weak_ptr<A>;
A() { std::cout << __PRETTY_FUNCTION__ << "\n"; }
~A() { std::cout << __PRETTY_FUNCTION__ << "\n"; }
};
int
main() {
{
std::unique_ptr<A::WeakPtr, void(*)(void*)>
uwp(static_cast<A::WeakPtr*>(std::malloc(sizeof(A::WeakPtr))), std::free);
A::WeakPtr* wp = uwp.get();
{
auto sp = std::make_shared<A>();
new(wp) A::WeakPtr(sp);
if (wp->lock())
std::cout << "Locked\n";
else
std::cout << "Unlocked\n";
}
if (wp->lock())
std::cerr << "EUNPOSSIBLE\n";
else
std::cout << "Unable to obtain lock\n";
// Need the following 'using' statement because the following is invalid syntax:
// wp->~A::WeakPtr();
using AWeakPtr = A::WeakPtr;
wp->~AWeakPtr();
// Is there a way to call A::WeakPtr without the using statement?
}
std::cout << "memory held by uwp has been free(3)'ed\n";
}
似乎应该有一种方法可以通过分散在某处的::
名称空间分隔符来击败typename
它,但它看起来不太可能。显然,如果不可能的话,这不是世界末日,但我的古玩越来越好。
更新
正如@DanielFrey 和@DyP 的精彩回答所建议的那样,正确的语法确实是
wp->A::WeakPtr::~WeakPtr();
但这不起作用,并且是 clang++ 中的一个错误(#12350)(截至 2013 年 9 月 28 日)。