在阅读《C++程序设计语言》(第4版)的异常处理章节时,有一个ad hoc清理代码的示例辅助工具:
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);
}
它被用作
auto act1 = finally([&]{ delete p; });
在声明act1的代码块结束时运行lambda代码。
我想当Stroustrup测试它时,由于“返回值优化”将Final_action<>限制为单个实例,这样做是有效的-但RVO只是一种可选的优化吗?如果从finally返回时实例被复制,显然~Final_action()将运行两次。换句话说,p被删除两次。
这种行为是否有标准中的防止措施,还是代码足够简单以便大多数编译器可以对其进行优化?
-fno-elide-constructors
,结果肯定是错误的。 - llllllllll