假设我有一个从std::enable_shared_from_this
派生的类
struct foo
: std::enable_shared_from_this<foo>
{
std::shared_ptr<foo> get_shared()
{
return shared_from_this();
}
bool is_shared() const
{
/* implementation ??? */
}
};
foo A;
auto S= A.get_shared(); // UB (pre c++17) or exception (c++17)
在c ++ 17之前,似乎没有办法检测对象foo
是否实际上由shared_ptr
管理。是吗?
但是即使对于c ++ 17,我也不确定如何最好地实现这种检测。一种明显的方法是
bool foo::is_shared() const
{
try {
shared_from_this();
} catch(...) {
return false;
}
return true;
}
但是可以避免使用try
-catch
吗?我可以使用weak_from_this()
吗?怎么样?
答案 0 :(得分:6)
您可以在C ++ 17中利用is_shared
来实现weak_from_this()
,例如:
bool is_shared() const
{
return !weak_from_this().expired();
}
这是无异常的,并且只会返回true
,因为该对象实际上是由shared_ptr
管理的。
在C ++ 17之前的版本中,没有方法进行检查,因为当对象不是shared_from_this()
所拥有时,调用shared_ptr
是一种不确定的行为。直到在C ++ 17中引入weak_from_this()
以后,我们才能(通过副本)访问weak_ptr
的私有std::enable_shared_from_this
成员,我们才能以定义的方式检查状态