我在读go语言的defer条声明.它允许您指定函数结束时要执行的操作.例如,如果您有一个文件指针或资源,而不是用每个可能的返回路径写入free/delete,您只需要指定一次defer函数.
看起来类似于最终会出现C++(What is standard defer/finalizer implementation in C++?, Will there be standardization of scope guard/scope exit idioms?),直到那时,有什么意外的事情发生在它的析构函数进行回调的对象上吗?它看起来像destructor order for local variables is sane,而且它也能很好地处理异常,尽管可能不会在信号上退出.
下面是一个示例实现.有什么问题吗?
#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";});
}
yields :Hello, world!