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
对象。可能在适配的 Smart
对象上调用 release(),若构造函数未调用它。
令
-
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*/ 代表 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 | 析构函数不会更新裸指针为空值 | 它会 |