Namespaces
Variants

std::inout_ptr_t<Smart,Pointer,Args...>:: operator Pointer*, std::inout_ptr_t<Smart,Pointer,Args...>:: operator void**

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)
std::inout_ptr_t
Member functions
inout_ptr_t::operator Pointer* inout_ptr_t::operator void**
Non-member functions
operator Pointer * ( ) const noexcept ;
(1) (C++23以降)
operator void ** ( ) const noexcept ;
(2) (C++23以降)

Pointer または void * オブジェクトのアドレスを外部関数に公開します。通常、この関数はその値が表す所有権を解放し、その後再初期化を行います。

1) 格納された Pointer オブジェクトのアドレスに * this を変換します。
2) * this void * オブジェクトのアドレスに変換する。この変換関数は、 Pointer void * と同じ型でない場合にのみオーバーロード解決に参加し、 Pointer がポインタ型でない場合、プログラムは不適格となる。
void * オブジェクトの初期値は、格納された Pointer オブジェクトの値を void * に変換した値と等しく、これに対する変更は デストラクタ で使用される Pointer 値に影響を与える。 * this の生存期間外で void * オブジェクトにアクセスすると未定義動作となる。

inout_ptr_t オブジェクトに対してこれら2つの変換関数のいずれかが呼び出された後、もう一方を同じオブジェクトに対して呼び出してはならない。そうでない場合、動作は未定義となる。

目次

パラメータ

(なし)

戻り値

1) 格納された Pointer オブジェクトのアドレス。
2) 前述の要件を満たす void * オブジェクトのアドレス。

注記

戻り値が指すオブジェクトが書き換えられていない場合、それは構築前の適応された Smart オブジェクトが保持していた値と等しい。

一般的な実装では、すべての Pointer 型であるポインタのオブジェクト表現は void * のオブジェクト表現と互換性があり、したがってこれらの実装では通常、 Pointer オブジェクトのストレージ内に void * オブジェクトを格納し、追加のストレージは必要ありません:

  • 実装が型ベースのエイリアス解析( 厳格なエイリアシング規則 に依存する)を有効にする場合、適切にアラインされた std:: byte [ sizeof ( void * ) ] メンバー部分オブジェクトを使用でき、両方の変換関数は配列内で 暗黙的に作成されたオブジェクト のアドレスを返します。
  • それ以外の場合、 Pointer メンバー部分オブジェクトを両方の変換関数に使用でき、 (2) はそのアドレスを直接 reinterpret_cast して void ** として返すことができます。

Pointer が、そのオブジェクト表現が void * と互換性のないポインタ型である場合、 (1) (または (2) )が呼び出されたかどうかを記録するために、追加の bool フラグが必要となる場合があります。