小编vba*_*bar的帖子

依靠RVO最终功能

阅读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被删除两次.

这种行为是否被标准中的某些东西阻止了,或者代码是否足够简单以便大多数编译器对其进行优化?

c++ c++11

9
推荐指数
1
解决办法
240
查看次数

标签 统计

c++ ×1

c++11 ×1