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

< 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` 为指针类型，则析构函数进行

  if (p) s = static_cast<Smart>(p); ，而若 sizeof...(Args) > 0 则程序非良构，

否则，若 s.reset(static_cast<SP>(p), std::forward<Args>(args)...) 为良构，则析构函数进行

  if (p) { /*do-release*/; s.reset(static_cast<SP>(p), std::forward<Args>(args)...); } ，

否则，若 std::is_constructible_v<Smart, SP, Args...> 为 true ，则析构函数进行

  if (p) { /*do-release*/; s = Smart(static_cast<SP>(p), std::forward<Args>(args)...); } ，

否则程序非良构。

### 注解

实现可能在构造时分配 `Smart` 所需的数据结构（例如控制块）的存储，以将不抛出的工作留给析构函数。

在重设后销毁按值捕获的实参。