命名空间
变体
操作

std::experimental::scope_exit

来自 cppreference.com
定义在头文件 <experimental/scope>
template< class EF >
class scope_exit;
(库基础 TS v3)

类模板 scope_exit 是一个通用的范围保护程序,旨在在退出范围时调用其退出函数。

scope_exit 不是 可复制构造可复制赋值可移动赋值,但是,如果 EF 满足某些要求,它可能是 可移动构造,这允许将 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 的默认删除器
(类模板) [编辑]