名前空間
変種
操作

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
 
 
メモリ管理ライブラリ
(説明用*)
未初期化メモリのアルゴリズム
(C++17)
(C++17)
(C++17)
制約付き未初期化
メモリアルゴリズム
Cライブラリ

アロケータ
メモリリソース
ガベージコレクションのサポート
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
未初期化ストレージ
(C++20まで*)
(C++20まで*)
明示的な生存期間管理
 
std::inout_ptr_t
メンバ関数
inout_ptr_t::operator Pointer*inout_ptr_t::operator void**
非メンバ関数
 
operator Pointer*() const noexcept;
(1) (C++23から)
operator void**() const noexcept;
(2) (C++23から)

Pointerまたはvoid*オブジェクトのアドレスを公開し、通常はそれらが表す所有権を解放し、再初期化します。

1) *thisを格納されているPointerオブジェクトのアドレスに変換します。
2) *thisvoid*オブジェクトのアドレスに変換します。この変換関数は、Pointervoid*と同じでない場合にのみオーバーロード解決に参加し、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**を返す可能性があります。

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

[編集]

English 日本語 中文(简体) 中文(繁體)