std::out_ptr_t<Smart,Pointer,Args...>::operator Pointer*, std::out_ptr_t<Smart,Pointer,Args...>::operator void**
來自 cppreference.com
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` 不是指標型別時程式才格式錯誤,此時它參與過載決議。
void* 物件的初始值等於儲存的 `Pointer` 物件轉換為 void* 的值,對其的任何修改都會影響 解構函式中使用的 `Pointer` 值。在 *this 的生命週期之外訪問 void* 物件的行為是未定義的。
void* 物件的初始值等於儲存的 `Pointer` 物件轉換為 void* 的值,對其的任何修改都會影響 解構函式中使用的 `Pointer` 值。在 *this 的生命週期之外訪問 void* 物件的行為是未定義的。
一旦在 `out_ptr_t` 物件上呼叫了這兩個轉換函式中的一個,就不應再呼叫另一個,否則行為是未定義的。
目錄 |
[編輯] 引數
(無)
[編輯] 返回值
1) 儲存的 `Pointer` 物件的地址。
2) 滿足上述要求的 void* 物件的地址。
[編輯] 注意
如果返回值指向的物件未被重寫,則它等於 nullptr。
在常見的實現中,作為指標型別的每個 `Pointer` 的物件表示都與 void* 的物件表示相容,因此這些實現通常將 void* 物件儲存在 `Pointer` 物件的儲存空間內,不需要額外儲存。
- 如果實現啟用基於型別的別名分析(依賴於嚴格別名規則),則可以使用一個正確對齊的 std::byte[sizeof(void*)] 成員子物件,並且兩個轉換函式都返回在陣列中隱式建立的物件的地址。
- 否則,`Pointer` 成員子物件可用於兩個轉換函式,並且 (2) 可直接將其地址 reinterpret_cast 為 void**。
如果 `Pointer` 是一種指標型別,其物件表示與 void* 不相容,則可能需要一個額外的 bool 標誌來記錄是否已呼叫 (1)(或 (2))。
[編輯] 示例
本節不完整 原因:無示例 |