shared_ptr<T>
shared_from_this(); // (1) C++11
constexpr shared_ptr<T>
shared_from_this(); // (1) C++26
shared_ptr<const T>
shared_from_this() const; // (2) C++11
constexpr shared_ptr<const T>
shared_from_this() const; // (2) C++26
概要
thisポインタをshared_ptrに変換する。
要件(C++14まで)
*thisのインスタンスがshared_ptrオブジェクトとして共有されていること。
戻り値
C++14まで
thisポインタを、enable_shared_from_thisの派生クラス型Tのshared_ptrオブジェクトとして構築して返す。
要件を満たしていない場合は未定義動作を引き起こす。
C++17から
保持するthisを指すポインタをweak_this(weak_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 ✅
- Clang: 3.0 ✅
- ICC: ?
- Visual C++: 2008 (TR1) ✅, 2010 ✅, 2012 ✅, 2013 ✅