全网整合营销服务商

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

免费咨询热线: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  # 接口  # 类模板  # 对象  # 链式  # 适用于  # 自定义  # 是一个  # 平铺直叙  # 也不  # 多个  # 两种  # 可在  # 不存在 


相关文章: 建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析  ,巨量百应是干嘛的?  MySQL查询结果复制到新表的方法(更新、插入)  如何获取免费开源的自助建站系统源码?  建站之星后台密码如何安全设置与找回?  安徽网站建设与外贸建站服务专业定制方案  想学网站制作怎么学,建立一个网站要花费多少?  实例解析angularjs的filter过滤器  如何在建站主机中优化服务器配置?  建站之星3.0如何解决常见操作问题?  如何选购建站域名与空间?自助平台全解析  建站之星代理商如何保障技术支持与售后服务?  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  电商平台网站制作流程,电商网站如何制作?  制作电商网页,电商供应链怎么做?  如何在腾讯云免费申请建站?  名字制作网站免费,所有小说网站的名字?  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  如何破解联通资金短缺导致的基站建设难题?  网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?  广州美橙建站如何快速搭建多端合一网站?  建站之星如何助力企业快速打造五合一网站?  成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?  开心动漫网站制作软件下载,十分开心动画为何停播?  头像制作网站在线制作软件,dw网页背景图像怎么设置?  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何快速使用云服务器搭建个人网站?  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  ,怎么用自己头像做动态表情包?  如何在Golang中引入测试模块_Golang测试包导入与使用实践  香港服务器网站卡顿?如何解决网络延迟与负载问题?  如何快速生成可下载的建站源码工具?  如何在IIS7上新建站点并设置安全权限?  h5在线制作网站电脑版下载,h5网页制作软件?  如何通过多用户协作模板快速搭建高效企业网站?  宝塔新建站点为何无法访问?如何排查?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  如何高效配置IIS服务器搭建网站?  ,交易猫的商品怎么发布到网站上去?  建站之星如何实现五合一智能建站与营销推广?  成都网站制作报价公司,成都工业用气开户费用?  如何快速建站并高效导出源代码?  详解jQuery停止动画——stop()方法的使用  如何用IIS7快速搭建并优化网站站点?  如何在橙子建站上传落地页?操作指南详解  网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?  昆明高端网站制作公司,昆明公租房申请网上登录入口?  如何选择网络建站服务器?高效建站必看指南  如何通过cPanel快速搭建网站?  如何在Golang中使用encoding/gob序列化对象_存储和传输数据 

您的项目需求

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