Namespaces
Variants

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

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
~inout_ptr_t ( ) ;
(自 C++23 起)

通过修改后的 Pointer 对象(若已调用 operator void ** ( ) 则为 void * 对象)的值及捕获的参数来重置适配的 Smart 对象。若构造函数未调用 release ( ) ,则可能在适配的 Smart 对象上调用该方法。

  • s 表示适配后的 Smart 对象,
  • args... 表示捕获的参数,
  • p 表示存储的 Pointer 值,或当调用过 operator void ** 时的 static_cast < Pointer > ( * operator void ** ( ) )
  • SP 定义为
    • Smart :: pointer 有效且表示类型时,取该值;否则,
    • Smart :: element_type 有效且表示类型时,取 Smart :: element_type * ;否则,
    • std:: pointer_traits < Smart > :: element_type 有效且表示类型时,取 std:: pointer_traits < Smart > :: element_type * ;否则,
    • Pointer
  • /*do-release*/ 表示:若 构造函数 未调用 release ( ) 则为 s. 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 ,则析构函数执行

/*执行释放操作*/ ; if ( p ) { s = Smart ( static_cast < SP > ( p ) , std:: forward < Args > ( args ) ... ) ; } ;

否则,程序将是格式错误的。

注释

实现可能会在构造时为 Smart 所需的数据结构(例如控制块)分配存储空间,以便将非抛出操作留给析构函数处理。

通过值捕获的参数在重置后会被销毁。

缺陷报告

下列行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。

缺陷报告 适用范围 发布时行为 正确行为
LWG 3897 C++23 析构函数未将原始指针更新为null值 现已更新