名稱空間
變體
操作

std::inout_ptr_t<Smart,Pointer,Args...>::~inout_ptr_t

來自 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*)
顯式生命週期管理
 
 
~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 值 它做了