std::inout_ptr_t<Smart,Pointer,Args...>::~inout_ptr_t
來自 cppreference.com
< cpp | memory | inout ptr t
~inout_ptr_t(); |
(C++23 起) | |
透過修改後的 Pointer
物件(如果呼叫了 operator void**(),則為 void* 物件)的值和捕獲的引數來重置被適配的 Smart
物件。如果建構函式沒有呼叫 release(),則可以在被適配的 Smart
物件上呼叫 release()。
令
-
s
表示被適配的Smart
物件, -
args...
表示捕獲的引數, -
p
表示儲存的Pointer
的值,如果呼叫了 operator void**,則為 static_cast<Pointer>(*operator void**()), -
SP
是- 如果 Smart::pointer 有效並表示一個型別,則為 Smart::pointer,否則
- Smart::element_type*,如果 Smart::element_type 有效且表示一個型別,否則,
- std::pointer_traits<Smart>::element_type*,如果 std::pointer_traits<Smart>::element_type 有效且表示一個型別,否則,
-
指標
,
- /*do-release*/ 表示 s.release(),如果 建構函式 沒有呼叫 release(),否則為空。
如果 Smart
是指標型別,解構函式執行
- s = static_cast<Smart>(p);,如果 sizeof...(Args) > 0,則程式格式錯誤;
否則,如果 s.reset(static_cast<SP>(p), std::forward<Args>(args)...) 格式良好,解構函式執行
- /*do-release*/; if (p) { s.reset(static_cast<SP>(p), std::forward<Args>(args)...); };
否則,如果 std::is_constructible_v<Smart, SP, Args...> 為 true,解構函式執行
- /*do-release*/; if (p) { s = Smart(static_cast<SP>(p), std::forward<Args>(args)...); };
否則,程式格式錯誤。
[編輯] 注意
實現可以在構造時為 Smart
所需的資料結構(例如控制塊)分配儲存空間,以便將不丟擲異常的工作留給解構函式。
按值捕獲的引數在重置後被銷燬。
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
LWG 3897 | C++23 | 解構函式未將原始指標更新為 null 值 | 它做了 |