std::experimental::unique_resource
From cppreference.com
                    
                                        
                    < cpp | experimental
                    
                                                            
                    | Defined in header  <experimental/scope> | ||
| template<class R, class D> class unique_resource; | (library fundamentals TS v3) | |
unique_resource is universal RAII wrapper for resource handles that owns and manages a resource through a handle and disposes of that resource when the unique_resource is destroyed.
The resource is disposed of using the deleter of type D when either of the following happens:
-  the managing unique_resourceobject is destroyed
-  the managing unique_resourceobject is assigned from another resource via operator= or reset().
Let type RS be R if R is an object type, or std::reference_wrapper<std::remove_reference_t<R>> otherwise:
-  unique_resourceeffectively holds a subobject of typeRSwhich is or wraps the resource handle, a deleter of typeDand a bool flag indicating whether the wrapper is owning the resource.
-  For explanatory purpose, the subobject of type RSis called stored resource handle, and the stored (ifRis an object type) or wrapped (ifRis a reference type)Ris called underlying resource handle. These two terms are not used by the LFTS.
Template parameters
| R | - | resource handle type | 
| D | - | deleter type | 
| Type requirements | ||
| - Rshall be an object type or an an lvalue reference to an object type. LetUnrefRbe std::remove_reference_t<R>,UnrefRshall be MoveConstructible, and ifUnrefRis not CopyConstructible, std::is_nothrow_move_constructible_v<UnrefR> shall be true. | ||
| - Dshall be a Destructible and MoveConstructible FunctionObject type, and ifDis not CopyConstructible, std::is_nothrow_move_constructible_v<D> shall be true. Given an lvaluedof typeDand an lvaluerof typeUnrefR, the expression d(r) shall be well-formed. | ||
Member functions
| constructs a new unique_resource(public member function) | |
| disposes the managed resource if such is present (public member function) | |
| assigns a unique_resource(public member function) | |
| Modifiers | |
| releases the ownership (public member function) | |
| disposes or replaces the managed resource (public member function) | |
| Observers | |
| accesses the underlying resource handle (public member function) | |
| accesses the deleter used for disposing of the managed resource (public member function) | |
| accesses the pointee if the resource handle is a pointer (public member function) | |
Non-member functions
| creates a unique_resource, checking invalid value(function template) | 
Deduction guides
Notes
Resource handle types satisfying NullablePointer can also be managed by std::unique_ptr. Unlike unique_ptr, unique_resource does not require NullablePointer.
Example
| This section is incomplete Reason: no example | 
See also
| (C++11) | smart pointer with unique object ownership semantics (class template) |