Namespaces
Variants

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

From ja.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::out_ptr_t
Member functions
out_ptr_t::operator Pointer* out_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 * オブジェクトにアクセスすると未定義動作となる。

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

目次

パラメータ

(なし)

戻り値

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

注記

戻り値が指すオブジェクトが書き換えられていない場合、それは nullptr と等しい。

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

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

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

例