std::experimental::scope_exit

来自cppreference.com

定义于头文件 <experimental/scope>
template<class EF>
class scope_exit;
(库基础 TS v3)

类模板 scope_exit 是通用的作用域防护,有意使它在退出作用域时调用其退出函数。

scope_exit可复制构造 (CopyConstructible) 可复制赋值 (CopyAssignable) 可移动赋值 (MoveAssignable) ,然而若 EF 满足某些要求则它可能为可移动构造 (MoveConstructible) ,这允许包装 scope_exit 到另一对象中。

scope_exit 可为活跃,即在析构时调用其退出函数,或为不活跃,即在析构时不做任何事。在从退出函数构造后 scope_exit 为活跃。

scope_exit 能因手动或自动(由移动构造函数)在它上调用 release() 后变得不活跃。亦可由从另一不活跃的 scope_exit 初始化获得不活跃的 scope_exit 。一旦 scope_exit 不活跃,则它不能再次变得活跃。

一个 scope_exit 等效地保有一个 EF 与一个指示它是否活跃的 bool 标签。

模板形参

EF - 退出函数的类型
类型要求
-
EF 可为:
-
以无参数调用 std::remove_reference_t<EF> 的左值必须为良构。

成员函数

构造新的 scope_exit
(公开成员函数)
在退出作用域时调用退出函数,若 scope_exit 为活跃,然后销毁 scope_exit
(公开成员函数)
operator=
[被删除]
scope_exit 不可赋值
(公开成员函数)
修改器
使 scope_exit 不活跃
(公开成员函数)

推导指引

注解

构造拥有动态存储期的 scope_exit 可能导致不期待的行为。

若存储于 scope_exit 对象的 EF 引用到定义它的函数的局部变量,例如为按引用捕获该变量的 lambda ,则在该 scope_exit 的析构函数执行并调用退出函数时该变量可能已经被返回。这能导致令人诧异的行为。

示例

参阅

包装函数对象并在通过异常退出作用域时调用
(类模板)
包装函数对象并在正常退出作用域时调用
(类模板)
unique_ptr 的默认删除器
(类模板)