全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

c++23的std::expected是什么 优雅地处理函数返回值和错误【新特性】

std::expected 是 C++23 引入的值或错误二选一的类模板,语义明确、零成本、需显式处理;支持 and_then/or_else 链式调用,区别于 optional(无错误上下文)和异常(非预期错误),适用于 I/O、解析等常规可恢复错误场景。

std::expected 是 C++23 引入的标准库新类型,用于明确区分成功结果与错误信息,替代传统上用返回值+全局 errno、异常、或自定义 pair/variant 的做法。它不是“可选值”,而是“预期得到某个值,否则得到一个错误”——语义更清晰,调用方必须显式处理两种可能。

核心设计:值 or 错误,二者必居其一

std::expected 是一个 持有 T(成功值)或 E(错误类型)的类模板,内部保证两者互斥且仅存其一。T 通常为返回的数据(如 int、string、自定义对象),E 通常是 std::error_code、std::string 或枚举类(如 my_error)。它不抛异常,也不依赖副作用,符合现代 C++ 的显式、零成本抽象原则。

  • 构造时直接指定值:std::expected result{42};
  • 构造错误:std::expected err{std::unexpect, "file not found"};
  • 检查状态:if (result.has_value()) { /* 成功 */ } else { /* 处理 result.error() */ }

链式调用:用 and_then、or_else 实现无异常的管道流

std::expected 支持类似 Rust Result 的组合操作,让多个可能失败的操作自然串联,避免层层嵌套 if 判断。

  • and_then:当前成功时执行函数,该函数也返回 expected;失败则短路,保留原错误
  • or_else:当前失败时执行函数,用于错误恢复或转换

例如:

auto res = read_config()
.and_then(parse_config)
.and_then(validate_config)
.or_else([](const auto& e) { return fallback_config(); });

整条链要么返回最终配置,要么返回 fallback 或原始错误,逻辑平铺直叙。

与异常、optional 的关键区别

不是 std::optional 的替代品:optional 表示“可能没有值”,但不说明“为什么没有”;expected 明确携带错误上下文,适合系统级 I/O、解析、校验等有丰富失败原因的场景。
不是异常的替代品:异常适合意外、不可恢复的错误(如内存耗尽);expected 适合预期中可能发生的常规错误(如文件不存在、JSON 格式错误),调用方应主动检查而非放任传播。

  • 性能确定:无栈展开开销,适合实时或嵌入式环境
  • 接口契约清晰:函数签名即表明“可能失败”,调用者无法忽略错误分支
  • 可与异常共存:你仍可在 expected 内部使用 throw,但推荐统一风格

实际使用建议

从 C++23 开始,优先在新接口中用 std::expected 替代 “int 返回码 + out 参数” 或 “throw std::runtime_error”。尤其适用于:

  • 文件读写、网络请求、配置加载等 I/O 操作
  • 字符串解析(JSON、URL、日期)、数值转换(stoi 安全版)
  • 工厂函数、构造辅助函数(当构造逻辑可能失败时)

注意:目前主流编译器(GCC 13+、Clang 16+、MSVC 19.35+)已支持,需开启 -std=c++23。标准库实现基于 头文件,无需第三方依赖。


# js  # json  #   # ai  # c++  # 区别  # 字符串解析  # 标准库  # 为什么  # rust  # String  # if  # throw  # Error  # const  # auto  # 字符串  # errno  # int  # 接口  # 类模板  # 对象  # 链式  # 适用于  # 自定义  # 是一个  # 平铺直叙  # 也不  # 多个  # 两种  # 可在  # 不存在 


相关文章: 如何在阿里云高效完成企业建站全流程?  昆明网站制作哪家好,昆明公租房申请网上登录入口?  高防服务器租用如何选择配置与防御等级?  我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?  定制建站模板如何实现SEO优化与智能系统配置?18字教程  如何在香港服务器上快速搭建免备案网站?  导航网站建站方案与优化指南:一站式高效搭建技巧解析  Android自定义listview布局实现上拉加载下拉刷新功能  建站之星上传入口如何快速找到?  如何快速搭建虚拟主机网站?新手必看指南  公司网站制作需要多少钱,找人做公司网站需要多少钱?  建站主机与服务器功能差异如何区分?  如何撰写建站申请书?关键要点有哪些?  高端建站三要素:定制模板、企业官网与响应式设计优化  学校为何禁止电信移动建设网站?  如何做静态网页,sublimetext3.0制作静态网页?  建站ABC备案流程中有哪些关键注意事项?  如何续费美橙建站之星域名及服务?  如何快速完成中国万网建站详细流程?  如何在IIS服务器上快速部署高效网站?  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  南宁网站建设制作定制,南宁网站建设可以定制吗?  宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?  网页设计与网站制作内容,怎样注册网站?  如何通过服务器快速搭建网站?完整步骤解析  免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?  如何快速搭建高效服务器建站系统?  金*站制作公司有哪些,金华教育集团官网?  宝塔面板创建网站无法访问?如何快速排查修复?  如何在腾讯云免费申请建站?  如何通过虚拟主机快速搭建个人网站?  头像制作网站在线制作软件,dw网页背景图像怎么设置?  西安专业网站制作公司有哪些,陕西省建行官方网站?  家庭服务器如何搭建个人网站?  可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?  北京营销型网站制作公司,可以用python做一个营销推广网站吗?  桂林网站制作公司有哪些,桂林马拉松怎么报名?  制作国外网站的软件,国外有哪些比较优质的网站推荐?  建站为何优先选择香港服务器?  MySQL查询结果复制到新表的方法(更新、插入)  制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?  网站制作公司,橙子建站是合法的吗?  制作证书网站有哪些,全国城建培训中心证书查询官网?  网页设计网站制作软件,microsoft office哪个可以创建网页?  做企业网站制作流程,企业网站制作基本流程有哪些?  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?  如何在阿里云ECS服务器部署织梦CMS网站?  如何获取上海专业网站定制建站电话?  如何生成腾讯云建站专用兑换码? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。