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(/* 见下文 */);
(库基础 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()
{
    // 避免在 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("文件存在。");
    else
        std::puts("文件不存在。");
}

可能的输出:

文件不存在。

参阅