CppDS.com

C++ 98 11 14 17 20 手册

std::experimental::scope_success

来自cppreference.com

定义于头文件 <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 的析构函数执行并调用退出函数时该变量可能已经被返回。这能导致令人诧异的行为。

示例

参阅

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