std::experimental::scope_success
来自 cppreference.com
< cpp | experimental
定义在头文件 <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
的析构函数执行时,该变量可能已返回,从而调用退出函数。这会导致令人惊讶的行为。
[编辑] 示例
本节不完整 原因:没有示例 |
[编辑] 另请参见
包装一个函数对象并在退出作用域时调用它 (类模板) | |
包装一个函数对象并在通过异常退出作用域时调用它 (类模板) | |
(C++11) |
unique_ptr 的默认删除器(类模板) |