std::inout_ptr_t<Smart,Pointer,Args...>::operator Pointer*, std::inout_ptr_t<Smart,Pointer,Args...>::operator void**
來自 cppreference.com
< cpp | 記憶體 | 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* 物件的地址。此轉換函式僅當
void* 物件的初始值等於儲存的
Pointer
與 void* 不同時才參與過載決議,並且如果 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_cast 為 void**。
如果 Pointer
是一種指標型別,其物件表示與 void* 不相容,則可能需要一個額外的 bool 標誌來記錄是否已呼叫 (1)(或 (2))。
[編輯] 示例
本節不完整 原因:無示例 |