std::inout_ptr_t<Smart,Pointer,Args...>::~inout_ptr_t
~inout_ptr_t();
使用修改后的 Pointer 对象(或者如果调用了 operator void**()
则是 void*
对象)和捕获的参数重置适配的 Smart 对象。如果构造函数没有调用 release()
,则可以在适配的 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()
),否则为空。
如果 s.reset(static_cast<SP>(p), std::forward<Args>(args)...)
是良构的,则析构函数执行
如果 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 所需的数据结构(例如控制块)分配存储,以便将非抛出工作留给析构函数。
按值捕获的参数在重置后被销毁。