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