Skip to content

Latest commit

 

History

History
82 lines (62 loc) · 2.86 KB

shared_from_this.md

File metadata and controls

82 lines (62 loc) · 2.86 KB

shared_from_this

  • memory[meta header]
  • std[meta namespace]
  • enable_shared_from_this[meta class]
  • function[meta id-type]
  • cpp11[meta cpp]
shared_ptr<T> shared_from_this();
shared_ptr<const T> shared_from_this() const;
  • shared_ptr[link /reference/memory/shared_ptr.md]

概要

thisポインタをshared_ptrに変換する。

要件(C++14まで)

*thisのインスタンスがshared_ptrオブジェクトとして共有されていること。

戻り値

C++14まで

thisポインタを、enable_shared_from_thisの派生クラス型Tshared_ptrオブジェクトとして構築して返す。
要件を満たしていない場合は未定義動作を引き起こす。

C++17から

保持するthisを指すポインタをweak_thisweak_ptr<T>)とすると、以下と等価。

return shared_ptr<T>(weak_this);

例外(C++17から)

この関数を呼び出した時点で、*thisのインスタンスがshared_ptrオブジェクトとして共有されていない場合、例外(おそらくbad_weak_ptr)を投げる。

この動作が望ましくない場合は、代わりにweak_from_this().lock()を用いることができる。この場合、例外を投げる代わりに空のshared_ptrオブジェクトを返す。

備考

enable_shared_from_this<T>の派生クラス型Tのコンストラクタ内ではまだenable_shared_from_thisの保持するthisを指すポインタが設定されていないので、(Tのコンストラクタ内では)本関数によってthisを指すshared_ptrを取得することはできない。
その場合、C++14までならば未定義動作となり、C++17以降は例外を送出する。

#include <cassert>
#include <memory>

struct X : public std::enable_shared_from_this<X> {
  std::shared_ptr<X> f()
  {
    // thisを指すshared_ptrオブジェクトを作る
    return shared_from_this();
  }
};

int main()
{
  std::shared_ptr<X> p(new X());
  std::shared_ptr<X> q = p->f();

  assert(p == q);
}

出力

バージョン

言語

  • C++11

処理系

  • GCC: 4.3.6 [mark verified]
  • Clang: 3.0 [mark verified]
  • ICC: ?
  • Visual C++: 2008 (TR1) [mark verified], 2010 [mark verified], 2012 [mark verified], 2013 [mark verified]

参照