最終更新日時: 2025年10月14日 14時41分25秒 (JST)
Akira Takahashi が更新

履歴 編集

function
<memory>

# std::enable_shared_from_this::shared_from_this(C++11)

    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 ✅

## 参照

- P0033R0 Re-enabling `shared_from_this`
- P0033R1 Re-enabling `shared_from_this` (revision 1)
- P3037R6 `constexpr std::shared_ptr` and friends