新闻中心

C++23中的std::expected怎么用_C++错误处理与std::expected使用

2025-11-09
浏览次数:
返回列表
std::expected 是C++23引入的用于显式处理预期错误的类型,它能安全携带成功值或错误信息。相比异常和 optional,它避免了异常开销且能表达具体错误原因。通过 .has_value()、.value()、.error() 等方法可安全访问结果,支持默认值回退和链式判断,适用于除法、字符串解析等可能失败的操作,提升代码健壮性。

c++23中的std::expected怎么用_c++错误处理与std::expected使用

在C++23中,std::expected 被正式引入作为处理预期结果或错误的标准化方式。它比传统的异常和返回码更灵活、更安全,尤其适合那些可能失败但又不值得抛出异常的函数。

什么是 std::expected?

std::expected 是一个模板类,表示一个操作要么成功并返回类型为 T 的值,要么失败并返回类型为 E 的错误信息。这与 std::optional 类似,但它不仅能表达“无值”,还能携带具体的错误原因。

举个例子:一个除法函数可以返回结果,也可以返回一个错误码说明“除零”:

#include <expected>
#include <iostream>

enum class MathError {
    DivisionByZero
};

std::expected<double, MathError> divide(double a, double b) {
    if (b == 0.0) {
        return std::unexpected(MathError::DivisionByZero);
    }
    return a / b;
}

调用时可以清晰地判断是否成功:

auto result = divide(10, 0);
if (result.has_value()) {
    std::cout << "Result: " << result.value() << "\n";
} else {
    std::cout << "Error: Division by zero\n";
}

如何检查结果和提取值?

std::expected 提供了几种方式来访问内部值或处理错误:

  • .has_value():判断是否包含正常值
  • .value():获取值,若无值则抛出异常(基于 E 构造)
  • .error():当出错时,获取错误对象
  • .value_or(default):有值则返回,否则返回默认值(仅当 E 可构造时可用)

示例:

auto res = divide(5, 2);
if (res) {
    std::cout << res.value(); // 输出 2.5
} else {
    if (res.error() == MathError::DivisionByZero) {
        std::cout << "Cannot divide by zero.";
    }
}

与异常和 optional 的对比

相比传统方式,std::expected 更明确地表达了“可预期的失败”:

易标AI 易标AI

告别低效手工,迎接AI标书新时代!3分钟智能生成,行业唯一具备查重功能,自动避雷废标项

易标AI 135 查看详情 易标AI
  • 异常:开销大,控制流跳转隐式,不适合高频调用或性能敏感场景
  • std::optional:只能表示“有/无”,无法说明为何失败
  • std::expected:显式携带错误信息,不依赖异常机制,类型安全

比如解析字符串为整数:

std::expected<int, std::string> try_parse_int(const std::string& s) {
    try {
        size_t pos;
        int value = std::stoi(s, &pos);
        if (pos != s.size()) {
            return std::unexpected("Invalid characters at end");
        }
        return value;
    } catch (...) {
        return std::unexpected("Parse failed");
    }
}

链式处理与 map/or_else 模式(模拟)

虽然 C++23 标准库未直接提供 mapand_then 方法,但你可以手动组合使用。

例如连续解析两个数并相加:

auto a = try_parse_int("42");
auto b = try_parse_int("abc");

if (a && b) {
    std::cout << "Sum: " << (a.value() + b.value()) << "\n";
} else {
    if (!a) std::cout << "First parse failed: " << a.error() << "\n";
    if (!b) std::cout << "Second parse failed: " << b.error() << "\n";
}

你也可以封装辅助函数实现类似函数式风格的处理逻辑。

基本上就这些。std::expected 让错误处理变得更直观、更安全,尤其是在系统编程、配置解析、IO操作等常见场景中非常实用。不复杂但容易忽略细节,比如正确使用 std::unexpected 来包装错误。用好它,代码会更健壮。

以上就是C++23中的std::expected怎么用_C++错误处理与std::expected使用的详细内容,更多请关注其它相关文章!


# 如何实现  # 汉中推广网站  # 西坞海外营销推广  # 唐山市政府网站建设公告  # 细河区关键词seo排名优化  # 煤机市场营销推广文案范文  # 广元百度网站推广  # 网络营销和推广公司名称  # 金堂找人做seo哪里有  # 标准化网站优化公司排名  # 江苏seo优化怎么收费  # 库中  # 默认值  # 游戏开发  # c++23  # 抛出  # 重写  # 数据结构  # 错误信息  # 如何使用  # 链式  # 标准库  # 字符串解析  # stream  # ios  # c++  # ai 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: WordPress插件开发:正确注册卸载钩子与避免常见陷阱  谷歌学术网站直达地址 谷歌学术搜索网页版一键进入  J*aScript map 迭代中检测空数组元素的有效方法  《刺客信条4:黑旗》重制版新细节曝光:无缝加载 地图更细致!  HTML元素状态管理:根据DIV内容动态启用/禁用按钮  vivo浏览器自带的下载器速度慢怎么办 vivo浏览器提升文件下载速度的技巧  向日葵客户端怎么进行远程CentOS控制_向日葵客户端远程CentOS控制操作教程  NRF24L01数据传输深度解析:解决大载荷接收异常与分包策略  黑猫投诉统一入口官网 消费者权益保护投诉平台  Node.js CSV 数据处理:基于字段空值条件过滤整条记录的策略  天眼查企业查询官网入口 天眼查官方网页版查询  Pyrogram与g4f集成:异步编程实践与常见错误解决  MinIO大规模对象列表性能瓶颈深度解析与外部元数据管理策略  qq游戏大厅官方下载_qq游戏免费下载安装入口  LINQ to XML为何解析失败? 深入理解C# XDocument的异常处理  HTML转PPT成品工具有哪些?HTML网页转PPT成品工具大全  qq邮箱日历功能怎么用_创建日程与会议邀请的技巧  俄罗斯Yandex免登录入口_Yandex搜索引擎官网一键直达  C++如何使用AddressSanitizer(ASan)_C++调试工具中检测内存访问错误的利器  Node.js 中使用 node-cron 实现定时 API 数据抓取与处理  高德地图沿途添加点失败如何解决 高德多点规划方法  html两个JS只运行一个怎么办_让双JS在html中都运行方法【技巧】  在哪找SublimeJ远程工具_SFTP插件配置教程  Golang如何优化CPU绑定任务分配策略_Golang CPU任务分配优化实践  照顾宝贝2小游戏点击立即在线玩  品牌机怎么重装系统 联想/戴尔/惠普笔记本恢复出厂系统教程  win11如何加载ICC颜色配置文件 Win11校色文件安装与显示器色彩管理【指南】  Promise错误处理:在catch后终止链式then执行的策略  Golang如何测试channel通信行为_Golang channel通信测试与分析方法  在J*a项目里如何构建对象之间的契约_接口约束的实际落地  c++中的std::basic_string的SSO优化_c++短字符串优化深度解析  J*a递归快速排序中静态变量导致数据累积问题的解决方案  CSS Flexbox如何实现多行排列_flex-wrap wrap自动换行显示  Surface怎么安装系统 微软Surface Pro U盘重装win11教程  优化 Jest 模拟:强制未实现函数抛出错误以提升测试效率  谷歌浏览器最新官方入口链接 谷歌浏览器网页版官网导航  特斯拉自动驾驶房车计划曝光 原型车将于2027年亮相  CSS子选择器:如何区分并样式化嵌套列表的子层级  c++中的std::launder有什么实际用途_c++对象生命周期与指针优化  LocoySpider如何部署到云服务器_LocoySpider云部署的远程配置  单12V-2&#215;6实现为RTX 5090供电750W!甚至都没敢跑分  Django表单提交验证失败后保持字段值不刷新  b站怎么取消点赞_b站点赞取消操作方法  sublime如何配置Python开发环境_将sublime打造成轻量级Python IDE  谷歌邮箱网页版官方页面入口 谷歌邮箱网页端快速访问  Python模块化编程:有效管理依赖与避免循环引用  J*a里如何使用N*igableMap进行导航操作_可导航Map操作技巧解析  Golang如何优雅处理error_Golang error处理最佳实践总结  如何设置Windows Defender的定时扫描_计划任务实现自动杀毒【安全】  win11专注助手在哪 Win11免打扰模式设置与自动化规则【指南】 

搜索