命名空间
变体
操作

std::experimental::make_unique_resource_checked

来自 cppreference.com
定义在头文件 <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) 初始化其删除器。仅当 bool(r == invalid)false 时,创建的 unique_resource 拥有该资源。

如果表达式 r == invalid 不能 隐式转换为 bool,则程序格式错误;如果转换导致未定义的行为或抛出异常,则行为未定义。

内容

[编辑] 参数

r - 资源句柄
d - 用于释放资源的删除器
invalid - 指示资源句柄无效的值

[编辑] 返回值

如上所述的 unique_resource

[编辑] 异常

在存储的资源句柄和删除器的初始化过程中抛出的任何异常。

[编辑] 备注

make_unique_resource_checked 用于避免使用无效参数调用删除器函数。

资源句柄 r 既可以复制也可以移动到返回值中,并且创建的 unique_resource 始终持有具有对象类型的底层资源句柄。

[编辑] 示例

#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 exists.");
    else
        std::puts("The file does not exist.");
}

可能的输出

The file does not exist.

[编辑] 另请参阅