命名空间
变体
操作

std::experimental::scope_success

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

类模板 scope_success 是一种通用的作用域保护器,旨在在正常退出作用域时调用其退出函数。

scope_success 不是 可复制构造可复制赋值可移动赋值,但是,它可能是 可移动构造,前提是 EF 满足某些要求,这允许将 scope_success 包装到另一个对象中。

scope_success 可以处于活动状态,即在销毁时调用其退出函数,也可以处于非活动状态,即在销毁时不执行任何操作。从退出函数构造后,scope_success 处于活动状态。

scope_success 可以通过手动或自动调用其上的 release()(通过移动构造函数)变为非活动状态。可以通过使用另一个非活动的 scope_success 初始化来获得非活动的 scope_success。一旦 scope_success 处于非活动状态,它就无法再次变为活动状态。

scope_success 有效地保存了一个 EF 和一个 bool 标志,指示它是否处于活动状态,以及一个未捕获异常的计数器,用于检测析构函数是否在堆栈展开期间被调用。

内容

[编辑] 模板参数

EF - 存储的退出函数的类型
类型要求
-
EF 应为
-
std::remove_reference_t<EF> 的左值进行无参数调用应是良构的。

[编辑] 成员函数

构造一个新的 scope_success
(公有成员函数) [编辑]
如果 scope_success 处于活动状态,则在正常退出作用域时调用退出函数,然后销毁 scope_success
(公有成员函数) [编辑]
operator=
[已删除]
scope_success 不可赋值
(公有成员函数)
修饰符
使 scope_success 处于非活动状态
(公有成员函数) [编辑]

[编辑] 推导指南

[编辑] 注释

构造动态存储期的 scope_success 可能会导致意外的行为。

构造从不同线程中创建的另一个 scope_success 中构造的 scope_success 也可能导致意外的行为,因为在销毁期间可能会比较在不同线程中获得的未捕获异常计数。

如果 scope_success 对象中存储的 EF 引用了定义它的函数的局部变量(例如,作为按引用捕获变量的 lambda),并且该变量在该函数中用作返回值操作数,则在 scope_success 的析构函数执行时,该变量可能已返回,从而调用退出函数。这会导致令人惊讶的行为。

[编辑] 示例

[编辑] 另请参见

包装一个函数对象并在退出作用域时调用它
(类模板) [编辑]
包装一个函数对象并在通过异常退出作用域时调用它
(类模板) [编辑]
unique_ptr 的默认删除器
(类模板) [编辑]