我正在阅读关于go语言的defer语句。它允许您指定在函数结束时要执行的操作。例如,如果您有一个文件指针或资源,而不是在每个可能的返回路径上写free/delete,您只需要一次指定defer函数即可。
看起来类似的功能最终可能会出现在C++中( C++中标准的defer/finalizer实现是什么?,将会有范围保护/退出惯用语的标准化吗?)。在此之前,使用其析构函数进行回调的对象是否存在未预见的问题?看起来本地变量的析构顺序是合理的,并且它也能很好地处理异常,尽管可能无法在信号上退出。
这是一个示例实现...是否有任何问题?
输出:
看起来类似的功能最终可能会出现在C++中( C++中标准的defer/finalizer实现是什么?,将会有范围保护/退出惯用语的标准化吗?)。在此之前,使用其析构函数进行回调的对象是否存在未预见的问题?看起来本地变量的析构顺序是合理的,并且它也能很好地处理异常,尽管可能无法在信号上退出。
这是一个示例实现...是否有任何问题?
#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";});
}
输出:
输出:你好,世界!
noexcept
。如果你在使用FrameExitTask
函数时返回正常,那么你的 finally 处理程序中的异常可能会起作用。如果该函数由于其他异常而退出,则来自处理程序的第二个异常将会引起问题。 - James Henstridge