名稱空間
變體
操作

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

來自 cppreference.com
 
 
記憶體管理庫
(僅作說明*)
未初始化記憶體演算法
(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 起)

Pointervoid* 物件的地址暴露給外部函式,該函式通常會釋放其值表示的所有權,然後重新初始化它。

1)*this 轉換為儲存的 Pointer 物件的地址。
2)*this 轉換為 void* 物件的地址。此轉換函式僅當 Pointervoid* 不同時才參與過載決議,並且如果 Pointer 不是指標型別,則程式格式錯誤。
void* 物件的初始值等於儲存的 Pointer 物件轉換為 void* 的值,對其的任何修改都會影響 解構函式 中使用的 Pointer 值。在 *this 的生命週期之外訪問 void* 物件具有未定義行為。

一旦在 inout_ptr_t 物件上呼叫了這兩個轉換函式中的一個,就不應再呼叫另一個,否則行為未定義。

目錄

[編輯] 引數

(無)

[編輯] 返回值

1) 儲存的 Pointer 物件的地址。
2) 滿足上述要求的 void* 物件的地址。

[編輯] 注意

如果返回值指向的物件未被重寫,則它等於構造前由適應的 Smart 物件持有的值。

在常見的實現中,作為指標型別的每個 Pointer 的物件表示都與 void* 相容,因此這些實現通常將 void* 物件儲存在 Pointer 物件的儲存空間中,不需要額外的儲存空間。

  • 如果實現啟用了基於型別的別名分析(依賴於嚴格別名規則),則可以使用一個對齊良好的 std::byte[sizeof(void*)] 成員子物件,並且這兩個轉換函式都返回陣列中隱式建立的物件的地址。
  • 否則,兩個轉換函式都可以使用 Pointer 成員子物件,並且 (2) 可以直接將其地址 reinterpret_castvoid**

如果 Pointer 是一種指標型別,其物件表示與 void* 不相容,則可能需要一個額外的 bool 標誌來記錄是否已呼叫 (1)(或 (2))。

[編輯] 示例