• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

    最終更新日時(UTC):
    が更新

    履歴 編集

    function
    <memory>

    std::enable_shared_from_this::shared_from_this

    shared_ptr<T> shared_from_this();
    shared_ptr<const T> shared_from_this() const;
    

    概要

    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

    処理系

    参照