名稱空間
變體
操作

std::inout_ptr_t

來自 cppreference.com
< cpp‎ | 記憶體
 
 
記憶體管理庫
(僅作說明*)
未初始化記憶體演算法
(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*)
顯式生命週期管理
 
 
定義於標頭檔案 <memory>
template< class Smart, class Pointer, class... Args >
class inout_ptr_t;
(C++23 起)

inout_ptr_t 用於適配智慧指標等型別,使其能夠與透過 Pointer*(通常是某些物件型別 TT**)或 void** 引數重置所有權的外部函式協同工作。

inout_ptr_t 在構造時捕獲額外引數,為上述外部函式訪問的結果提供儲存,釋放被適配的 Smart 物件所持有的所有權,最後在銷燬時用結果和捕獲的引數重置被適配的 Smart 物件。

inout_ptr_t 的行為就像它持有以下非靜態資料成員:

  • 一個 Smart& 引用,在構造時繫結到被適配的物件,
  • 對於 Args... 中的每個 T,一個型別為 T 的成員,它是在構造時捕獲並在銷燬時用於重置的引數,以及
  • 一個適合在其內部儲存 Pointer 並提供 void* 物件的成員子物件,其中 Pointervoid* 物件通常暴露給外部函式以重置所有權。

如果 Smart 不是指標型別,則在被適配的物件上最多呼叫一次 release()。如果 Pointer 的值不為空,實現可以在建構函式中或在解構函式中重置之前呼叫 release()

使用者可以透過在 Args... 中分別指定物件型別或引用型別來控制每個重置引數是以複製還是以引用方式捕獲。

目錄

[edit] 模板引數

Smart - 要適配的物件的型別(通常是智慧指標)
指標 - 外部函式訪問的物件的型別(通常是原始指標),用於重置所有權
Args... - 用於重置被適配物件的捕獲引數的型別
型別要求
-
Pointer 必須滿足 NullablePointer 的要求。
-
如果 Smartstd::shared_ptr 特化,則程式是非良構的。

[edit] 特化

與標準庫中的大多數類模板不同,依賴於至少一個程式定義型別inout_ptr_t 程式定義特化無需滿足主模板的要求。

此許可允許程式定義特化將儲存在非標準智慧指標中的原始指標暴露給外部函式。

[edit] 成員函式

構造一個 inout_ptr_t
(公開成員函式)
operator=
[已刪除](C++23)
inout_ptr_t 不可賦值
(公開成員函式)
釋放所有權後重置被適配的智慧指標
(公開成員函式)
inout_ptr_t 轉換為輸出儲存的地址
(公開成員函式)

[edit] 非成員函式

(C++23)
建立一個帶有關聯智慧指標和重置引數的 inout_ptr_t
(函式模板) [edit]

[edit] 注意

inout_ptr_t 期望外部函式釋放由所指向的 Pointer 的值所代表的所有權,然後重新初始化它。由於此操作需要唯一所有權,因此禁止與 std::shared_ptr 一起使用。

inout_ptr_t 的典型用法是透過 std::inout_ptr 建立其臨時物件,它會立即重置被適配的智慧指標。例如,給定一個設定函式和宣告為 int foreign_resetter(T**);std::unique_ptr<T, D> up; 的相應智慧指標,

if (int ec = foreign_resetter(std::inout_ptr(up)))
    return ec;

大致等同於

T *raw_p = up.get();
up.release();
int ec = foreign_resetter(&raw_p);
up.reset(raw_p);
if (ec != 0)
    return ec;

不建議建立具有自動儲存期以外儲存期inout_ptr_t 物件,因為此類程式碼很可能產生懸空引用並在銷燬時導致未定義行為。

捕獲的引數通常被打包到 std::tuple<Args...> 中。實現可以使用不同的機制來提供它們需要持有的 Pointervoid* 物件。


特性測試 標準 特性
__cpp_lib_out_ptr 202106L (C++23) std::out_ptr, std::inout_ptr
202311L (C++26) 獨立的 std::out_ptrstd::inout_ptr

[edit] 示例

[edit] 參閱

(C++23)
與外部指標設定器互動,並在銷燬時重置智慧指標
(類模板) [edit]
具有唯一物件所有權語義的智慧指標
(類模板) [edit]
具有共享物件所有權語義的智慧指標
(類模板) [edit]