std::experimental::scope_success
来自cppreference.com
< cpp | experimental
在标头 <experimental/scope> 定义
|
||
template<class EF> class scope_success; |
(库基础 TS v3) | |
类模板 scope_success
是通用的作用域防护,有意使它在正常退出作用域时调用其退出函数。
scope_success
非可复制构造 (CopyConstructible) 、可复制赋值 (CopyAssignable) 或可移动赋值 (MoveAssignable) ,然而若 EF
满足某些要求则它可能为可移动构造 (MoveConstructible) ,这允许包装 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 的默认删除器 (类模板) |