CRTP基类继承std :: enable_shared_from_this,并抛出std :: bad_weak_ptr。我需要安静

时间:2019-01-07 05:08:36

标签: c++ c++17

当我尝试在基类share_from_this()shared_handler返回一个DerivedT共享指针时,我抛出了一个异常:std::bad_weak_ptr

在构造之前,我曾尝试在调用shared_from_this()之前将内部共享指针存储在基类中,但是却遇到了更加模棱两可的错误。

template<class DerivedT>
struct shared_handler : std::enable_shared_from_this<DerivedT>
{
  void some_method(arbitrary input) {
    do_something(shared_from_this());
  }
};

struct my_handler : shared_handler<my_handler>
{
  my_handler()
  {
    some_method("hello");
  }
};

1 个答案:

答案 0 :(得分:1)

template<class DerivedT>
struct shared_handler : std::enable_shared_from_this<shared_handler<DerivedT>>
{
  void some_method(arbitrary input) {
    do_something(shared_from_this());
  }
};

来自http://prntscr.com/m3xqjb

  

只允许在先前共享的对象上调用shared_from_this,即在std::shared_ptr<T>管理的对象上调用。否则,将抛出std::bad_weak_ptr(由shared_ptr构造函数从默认构造的weak_this中抛出)。

直到C ++ 17,它都是未定义的行为。