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

< cpp‎ | memory‎ | out ptr t

~out_ptr_t(); |  | (C++23 起)

以修改的 `Pointer` 对象（或若调用了 operator void**() 则为 void* 对象）的值捕获的实参重设适配的 `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` 。

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

  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` 是 std::shared_ptr 的特化，则实现可以在构造时分配重设新的控制块的存储，以将不抛出的工作留给析构函数。

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