Namespaces
Variants

std:: out_ptr

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
ヘッダーで定義 <memory>
template < class Pointer = void , class Smart, class ... Args >
auto out_ptr ( Smart & s, Args && ... args ) ;
(C++23以降)

リセットのための引数を参照によってキャプチャする、推定されたテンプレート引数を持つ std::out_ptr_t を返します。

戻り値(下記参照)の構築が不適格である場合、プログラムは不適格です。

目次

パラメータ

s - アダプトするオブジェクト(通常はスマートポインタ)
args... - リセット用にキャプチャする引数

戻り値

std:: out_ptr_t < Smart, P, Args && > ( s, std:: forward < Args > ( args ) ... ) 、ここで P

  • Pointer 、もし Pointer void 型でない場合。そうでなければ、
  • Smart :: pointer 、それが有効かつ型を示す場合。そうでなければ、
  • Smart :: element_type * 、もし Smart :: element_type が有効かつ型を示す場合。そうでなければ、
  • std:: pointer_traits < Smart > :: element_type *

注記

ユーザーはテンプレートパラメータ Pointer のテンプレート引数を指定することで、 Pointer * を受け取る外部関数との相互運用が可能になります。

すべてのリセット引数は参照によってキャプチャされるため、返される out_ptr_t は、フルエクスプレッションの終了時に破棄される一時オブジェクトであるべきです。これにより、ダングリング参照を回避するために、外部関数呼び出しを含むフルエクスプレッション内で適切に管理されます。

機能テスト マクロ 標準 機能
__cpp_lib_out_ptr 202106L (C++23) std::out_ptr , std::inout_ptr
202311L (C++26) フリースタンディング std::out_ptr および std::inout_ptr

std::out_ptr を使用してスマートポインタを sqlite3_open に適応させます。この関数は出力パラメータとして sqlite3** を期待します。

#include <memory>
#include <sqlite3.h>
int main()
{
    auto close_db = [](sqlite3* db) { sqlite3_close(db); };
    {
        // メモリ内データベースを開き、その寿命をstd::unique_ptrで管理する
        std::unique_ptr<sqlite3, decltype(close_db)> up;
        sqlite3_open(":memory:", std::out_ptr(up));
        sqlite3* db = up.get();
        // dbを使用して何か処理を実行...
    }
    {
        // 上記と同じ処理をstd::shared_ptrで実行
        std::shared_ptr<sqlite3> sp;
        sqlite3_open(":memory:", std::out_ptr(sp, close_db));
        sqlite3* db = sp.get();
        // dbを使用して何か処理を実行...
    }
}

関連項目

(C++23)
関連するスマートポインタとリセット引数を持つ inout_ptr_t を作成する
(関数テンプレート)
新しいオブジェクトを管理するユニークポインタを作成する
(関数テンプレート)
新しいオブジェクトを管理する共有ポインタを作成する
(関数テンプレート)