# std::experimental::make_unique_resource_checked

< cpp‎ | experimental‎ | unique resource

定义于头文件 `<experimental/scope>` |  |
template <class R, class D, class S = std::decay_t<R>> std::experimental::unique_resource<std::decay_t<R>, std::decay_t<D>> make_unique_resource_checked(R&& r, const S& invalid, D&& d) noexcept(/*see below*/); |  | (库基础 TS v3)

创建 `unique_resource` ，以 std::forward<R>(r) 初始化其存储的资源柄，以 std::forward<D>(d) 初始化其删除器。创建的 `unique_resource` 占有资源当且仅当 bool(r == invalid) 为 false 。

若 r == invalid 不能按语境转换成 bool，则程序为谬构，而若该转换导致未定义行为或抛异常，则行为未定义。

### 参数

r | - | 资源柄
d | - | 用于释放资源的删除器
invalid | - | 指示资源柄为非法的值

### 返回值

如上所述的 `unique_resource` 。

### 异常

存储的资源柄与删除器的初始化中抛出的任何异常。

`noexcept` 说明：
noexcept(

std::is_nothrow_constructible_v<std::decay_t<R>, R> &&
std::is_nothrow_constructible_v<std::decay_t<D>, D>

)

### 注解

`make_unique_resource_checked` 存在是为了避免以非法参数调用删除器函数。

复制或移动资源柄 `r` 到返回值中，而创建的 `unique_resource` 始终保有拥有对象类型的底层资源柄。

### 示例

    #include <cstdio>
    #include <experimental/scope>

    int main()
    {
        // 避免在 fclose 失败时调用 fclose
        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.");
        }
    }

可能的输出：

    The file does not exist.

### 参阅