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


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 更明确地表达了“可预期的失败”:

Beautiful.ai Beautiful.ai

AI在线创建幻灯片

Beautiful.ai 108 查看详情 Beautiful.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如何做图片的优化  # seo站长博客  # 咸宁市优化网站建设  # 是在  # 是一个  # 判断是否  # c++23  # 如何实现  # 抛出  # 如何使用  # 错误信息  # 链式  # 多核  # 标准库  # 字符串解析  # stream  # ios  # c++  # ai 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 《桃源记2》资源采集攻略  背部总是隐隐作痛怎么回事 背痛如何改善  POKI小游戏在线免费入口链接 POKI小游戏无下载秒玩玩  PHP odbc_fetch_array 返回值处理:如何正确访问嵌套数组元素  照片整理的黄金法则是怎样的? 理解“收集-筛选-归档-备份”四步流程  快递物流路径揭秘  cad怎么隐藏指定的图层_cad隐藏或冻结图层方法  Selenium自动化:利用键盘模拟解决复杂日期输入框输入问题  鸣潮历史学家灯塔位置一览  之了课堂app做题入口  解决SQLAlchemy模型跨文件关联的Linter兼容性指南  如何在Podman容器中运行Composer_Docker替代品Podman的PHP与Composer容器化实践  汽水音乐官方网站登录入口_汽水音乐网页版进入链接  百度小说看书时如何翻页_百度小说手动翻页与自动翻页设置  阿里旺旺电脑网页版入口 阿里旺旺电脑版网页登录入口  《下一站江湖2》大雪山加入方法  Composer如何使用composer-plugin-api开发自定义插件  PHP多语言网站的实现:会话管理与翻译函数优化教程  如何在mysql中设计餐饮点餐系统_mysql点餐系统项目实战  苹果11如何更换iCloud账号_苹果11账号切换的具体步骤  创建您的便携版VS Code:让配置随身携带  解决Pandas DataFrame高度碎片化警告:高效创建多列的策略  《顺丰同城骑士》查看我的技能方法  免费占卜在线神算_免费占卜手机神算  西瓜视频怎么查看访客记录_西瓜视频访客记录查看方法  Python中安全地将环境变量转换为整数的类型注解指南  如何在CSS中使用absolute实现登录弹窗居中_transform translate结合  Win10如何关闭操作中心通知 Win10免打扰设置全攻略【清爽】  《sketchbook》选中部分图案移动方法  掌握产品代码正则表达式:避免常见陷阱与精确匹配  口腔诊所管理软件推荐  ExcelSCAN与LAMBDA如何创建自定义移动平均函数_SCAN实现任意窗口期移动平均计算  有道AI翻译入口 智能写作官方网站入口  《梦想世界:长风问剑录》药师一图流分享  使用AI在VS Code中将代码从一种语言翻译成另一种  J*aScript事件处理:优化键盘输入与表单提交的实践指南  精通VS Code多光标编辑以实现闪电般快速的修改  J*aScript对象中深度嵌套URL键的查找与更新策略  电脑双系统如何安装和卸载 Windows和Linux双系统安装教程【详解】  《狐友》联系客服方法  使用Python和GBGB API高效抓取指定日期范围和赛道比赛结果教程  《百果园》充值余额方法  《律学法考》查看学习数据方法  顺丰快递收费标准查询_如何查看顺丰最新收费价格  j*a中ArrayBlockingQueue的使用  《随手记》启用语音备注方法  J*aScript中高效处理用户输入:从Keyup事件到表单提交的优化实践  拷贝漫画2025网页版入口 拷贝漫画官网免费看全集  百度网盘网页入口链接分享 百度网盘官网入口网页登录  TikTok网页版入口快速访问 TikTok官网账号登录方法 

 2025-11-09

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.