You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 11:34:55