std::experimental::make_unique_resource_checked(3)

NAME
std::experimental::make_unique_resource_checked - std::experimental::make_unique_resource_checked

Synopsis
   Defined in header <experimental/scope>
   template <class R, class D, class S = std::decay_t<R>>
   std::experimental::unique_resource<std::decay_t<R>, (library
   std::decay_t<D>> fundamentals TS v3)
   make_unique_resource_checked(R&& r, const S& invalid, D&& d)
   noexcept(/*see below*/);
   Creates a unique_resource, initializes its stored resource handle is initialized
   with std::forward<R>(r) and its deleter with std::forward<D>(d). The created
   unique_resource owns the resource if and only if bool(r == invalid) is false.
   The program is ill-formed if the expression r == invalid cannot be contextually
   converted to bool, and the behavior is undefined if the conversion results in
   undefined behavior or throws an exception.
  Paramaters
   r - a resouce handle
   d - a deleter to use to dispose the resource
   invalid - a value indicating the resource handle is invalid
  Reture value
   A unique_resource described above.

Exceptions
   Any exception thrown in initialization of the stored resource handle and the
   deleter.
   noexcept specification:
   noexcept(
   std::is_nothrow_constructible_v<std::decay_t<R>, R> &&
   std::is_nothrow_constructible_v<std::decay_t<D>, D>
   )

Notes
   make_unique_resource_checked exists to avoid calling a deleter function with an
   invalid argument.
   Resource handle r is either copied or moved into the return value, and the created
   unique_resource always holds an underlying resource handle with object type.

Example
// Run this code
 #include <cstdio>
 #include <experimental/scope>
 int main()
 {
     // avoid calling fclose when fopen fails
     auto file = std::experimental::make_unique_resource_checked(
         std::fopen("potentially_nonexistent_file.txt", "r"),
         nullptr,
         [](std::FILE *fptr){ std::fclose(fptr); }
     );
     if (file.get()) {
         std::puts("The file exits.");
     }
     else {
         std::puts("The file does not exist.");
     }
 }

Possible output:
 The file does not exist.

See also