如何在if语句内修改gsl::final_action?其赋值构造函数已删除
解决gsl::final_action无法赋值的问题
因为gsl::final_action的赋值构造函数被删除了,直接赋值cleanup = gsl::finally(...)肯定会报错。针对你需要在父作用域末尾执行资源清理的需求,这里有两个实用方案:
方案一:带判断逻辑的lambda兜底
最简洁的方式是一开始就定义好包含判断逻辑的清理lambda,让它自动根据资源是否存在来决定是否执行清理:
some* resource = nullptr; auto cleanup = gsl::finally([&] { // 仅当资源被成功创建时执行清理 if (resource != nullptr) { delete_resource(resource); } }); if (condition) { resource = create_resource(); }
父作用域结束时,cleanup绑定的lambda会自动执行,它会检查resource是否有效,有效就调用delete_resource,完全匹配你的需求。
方案二:用std::optional包装final_action
如果需要更灵活的清理逻辑(比如不同条件下执行不同清理操作),可以用std::optional包装gsl::final_action,通过emplace创建实例:
#include <optional> some* resource = nullptr; std::optional<gsl::final_action<decltype([&] { delete_resource(resource); })>> cleanup; if (condition) { resource = create_resource(); // 在optional内构造final_action,避开赋值操作 cleanup.emplace(gsl::finally([&] { delete_resource(resource); })); }
std::optional默认是空状态,当条件满足时才构造实际的final_action,父作用域结束时,optional会自动销毁内部的final_action,触发清理逻辑。
内容的提问来源于stack exchange,提问作者7chenko
相关产品推荐
相关产品推荐

