struct S
{
  shared_ptr<S> dangerous() {
    return shared_ptr<S> (this);
  }
};

위와 같은 코드는 dangerous가 리턴하는 순간 delete this가 호출되므로 사용할 수 없는 코드이다.

따라서 this에 대한 shared_ptr을 얻을 수 있도록 enable_shared_from_this 템플릿이 같이 제공된다.

그러나 enable_shared_from_this를 상속받았어도

생성자의 실행이 완료되고 shared_ptr에 한 번은 대입된 후에야 shared_from_this를 사용할 수 있다.

즉, 생성자 안에서 this에 대한 weak_ptr을 얻을 수는 없다.

C++11에 도입된 smart pointer들의 원형인 boost의 문서에서는 이에 대한 유일한 해법으로서 factory method를 제시한다.