std::out_ptr_t<Smart,Pointer,Args...>::operator Pointer*, std::out_ptr_t<Smart,Pointer,Args...>::operator void**
From cppreference.com
| operator Pointer*() const noexcept; |
(1) | (C++23から) |
| operator void**() const noexcept; |
(2) | (C++23から) |
外部関数に、一般的に再初期化されるPointerまたはvoid*オブジェクトのアドレスを公開します。
1) *this を、格納されている
Pointerオブジェクトのアドレスに変換します。2) *this を、void* オブジェクトのアドレスに変換します。この変換関数は、
void* オブジェクトの初期値は、void* に変換された格納されている
Pointerがvoid*と異なり、かつプログラムがPointerがポインタ型でない場合に不定形であれば、オーバーロード解決に参加します。void* オブジェクトの初期値は、void* に変換された格納されている
Pointerオブジェクトの値に等しく、それへのいかなる変更もデストラクタで使用されるPointer値に影響します。void* オブジェクトを、*this の生存期間外でアクセスすると、未定義の動作となります。これらの2つの変換関数のいずれかがout_ptr_tオブジェクトに対して呼び出されると、もう一方は呼び出されるべきではありません。それ以外の場合は、動作は未定義です。
目次 |
[編集] パラメータ
(なし)
[編集] 戻り値
1) 格納されている
Pointerオブジェクトのアドレス。2) 前述の要件を満たすvoid*オブジェクトのアドレス。
[編集] 注釈
戻り値が指すオブジェクトが書き換えられていない場合、それはnullptrに等しくなります。
一般的な実装では、ポインタ型であるすべてのPointerのオブジェクト表現はvoid*のオブジェクト表現と互換性があり、したがってこれらの実装は通常、Pointerオブジェクトのストレージ内にvoid*オブジェクトを格納し、追加のストレージは不要です。
- 実装が型ベースのエイリアス解析(厳密エイリアス規則に依存)を有効にしている場合、適切にアライメントされたstd::byte[sizeof(void*)]メンバサブオブジェクトが使用される可能性があり、両方の変換関数は、配列内に暗黙的に作成されたオブジェクトのアドレスを返します。
- それ以外の場合、
Pointerメンバサブオブジェクトが両方の変換関数に使用される可能性があり、(2) は直接そのアドレスをvoid**にreinterpret_castして返す可能性があります。
Pointerがvoid*のオブジェクト表現と互換性のないポインタ型である場合、(1)(または(2))が呼び出されたかどうかを記録するために、追加のboolフラグが必要になる可能性があります。
[編集] 例
| このセクションは未完成です 理由: 例がありません |