它看起来像一个模拟可能会转到C 最终(什么是C标准延迟/终结执行? ,会不会有范围后卫/范围退出成语?标准化在此之前,有什么意外讲的是一个对象,它这样做析构函数进行回调?看起来局部变量的析构函数顺序是理智的,并且它也可以很好地处理异常,尽管可能不会在信号上退出。
这是一个示例实现…对此有什么麻烦吗?
#include <iostream> #include <functional> using namespace std; class FrameExitTask { std::function<void()> func_; public: FrameExitTask(std::function<void()> func) : func_(func) { } ~FrameExitTask() { func_(); } FrameExitTask& operator=(const FrameExitTask&) = delete; FrameExitTask(const FrameExitTask&) = delete; }; int main() { FrameExitTask outer_task([](){cout << "world!";}); FrameExitTask inner_task([](){cout << "Hello, ";}); if (1+1 == 2) return -1; FrameExitTask skipped_task([](){cout << "Blam";}); }
输出: Hello, world!
Hello, world!
这已经存在,它被称为范围卫士。观看这个精彩的演讲:https : //channel9.msdn.com/Shows/Going+Deep/C-and-Beyond-2012-Andrei-Alexandrescu- Systematic-Error-Handling- in-C。这使您可以轻松创建要在退出时调用的任意可调用对象。这是较新的版本;它最初是在很久以前就开发出来的。
通常它可以完美运行,但是我不确定您处理异常的含义。从必须在范围出口处调用的函数引发异常是一团糟。原因:当引发异常(而不是立即捕获)时,当前作用域退出。所有析构函数都将运行,并且异常将继续传播。如果其中一个破坏者抛出,该怎么办?您现在有两个实时例外。
我想一种语言可以尝试解决这个问题,但这很复杂。在C ++中,很少将抛出析构函数视为好主意。