This question already has answers here:
What is standard defer/finalizer implementation in C++?
(8个答案)
5年前关闭。
我正在阅读有关Go语言的defer声明。它允许您指定函数结束后要执行的操作。例如,如果您有文件指针或资源,则无需为每个可能的返回路径编写可用/删除操作,而只需指定一次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,它也可以很好地处理异常,尽管可能不会在信号上退出。
这是一个示例实现...对此有什么麻烦吗?
输出:
(8个答案)
5年前关闭。
我正在阅读有关Go语言的defer声明。它允许您指定函数结束后要执行的操作。例如,如果您有文件指针或资源,则无需为每个可能的返回路径编写可用/删除操作,而只需指定一次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";});
}
输出:
Hello, world!
最佳答案
这已经存在,它被称为范围 guard 。观看这个精彩的演讲:https://channel9.msdn.com/Shows/Going+Deep/C-and-Beyond-2012-Andrei-Alexandrescu-Systematic-Error-Handling-in-C。这使您可以轻松创建要在退出时调用的任意可调用对象。这是较新的版本;它最初是在很久以前就开发出来的。
通常它可以完美运行,但是我不确定您处理异常的含义。从必须在范围导出处调用的函数引发异常是一团糟。原因:当引发异常(而不是立即捕获)时,当前作用域退出。所有析构函数都将运行,并且异常将继续传播。如果其中一个破坏者抛出,该怎么办?您现在有两个实时异常(exception)。
我想一种语言可以尝试解决这个问题,但这很复杂。在C++中,很少将抛出析构函数视为好主意。
关于c++ - C++中的golang风格 “defer” ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33050620/
10-13 02:25