阅读C++编程语言(第4版),在"异常处理"一章中,有一个用于临时清理代码的示例帮助:
template<typename F>
struct Final_action {
Final_action(F f): clean{f} {}
~Final_action() { clean(); }
F clean;
};
template<class F>
Final_action<F> finally(F f)
{
return Final_action<F>(f);
}
Run Code Online (Sandbox Code Playgroud)
它用得像
auto act1 = finally([&]{ delete p; });
Run Code Online (Sandbox Code Playgroud)
在声明act1的块的末尾运行lambda代码.
我认为这对Stroustrup在测试时起作用,因为返回值优化限制Final_action<>为单个实例 - 但是RVO不是可选的优化吗?如果在从finally返回时复制实例,则显然会~Final_action()为两个副本运行.换句话说,p被删除两次.
这种行为是否被标准中的某些东西阻止了,或者代码是否足够简单以便大多数编译器对其进行优化?