首页 > 后端开发 > C++ > 正文

C++23的std::expected是什么_C++中优雅处理函数返回值与错误的现代方法

下次还敢
发布: 2025-11-23 04:47:20
原创
616人浏览过
c++kquote>std::expected<T, E> 是 C++23 引入的模板类,用于表示操作成功时包含类型为 T 的值,失败时包含类型为 E 的错误信息;2. 它相比异常和错误码更安全高效,能明确传达失败原因且无运行时开销;3. 支持 has_value、error、隐式布尔转换及 and_then、or_else 等链式操作,提升错误处理的可读性与表达力;4. 推荐用于文件读取、网络请求等可能失败的操作,错误类型宜用枚举或轻量结构体;5. 当前 GCC 13+ 和 Clang 17+ 在 -std=c++23 下部分支持,MSVC 正在跟进,暂不可用时可使用 TL::expected 过渡。

c++23的std::expected是什么_c++中优雅处理函数返回值与错误的现代方法

在C++23中,std::expected 是一种全新的类型,用于更清晰、更安全地处理可能失败的函数调用。它提供了一种比异常和错误码更现代、更直观的方式来表达“期望得到一个值,但也可能得到一个错误”的语义。

什么是 std::expected?

std::expected<T, E> 是一个模板类,表示要么包含一个类型为 T 的成功值(the expected value),要么包含一个类型为 E 的错误值。这与 std::optional<T> 类似,但不同的是:optional 表示“有值或无值”,而 expected 明确告诉你“为什么没有值”——因为它包含了具体的错误信息。

举个例子:

假设你写一个函数来解析整数:

立即学习C++免费学习笔记(深入)”;

std::expected<int, std::string> parse_int(const std::string& str) {
    try {
        size_t pos;
        int value = std::stoi(str, &pos);
        if (pos != str.size()) {
            return std::unexpected("Invalid: extra characters");
        }
        return value;
    } catch (const std::invalid_argument&) {
        return std::unexpected("Invalid argument");
    } catch (const std::out_of_range&) {
        return std::unexpected("Number out of range");
    }
}
登录后复制

调用时可以这样处理结果:

auto result = parse_int("123abc");
if (result.has_value()) {
    std::cout << "Got: " << *result << "\n";
} else {
    std::cout << "Parse error: " << result.error() << "\n";
}
登录后复制

相比传统方法的优势

以往我们常用以下方式处理错误:

寻鲸AI
寻鲸AI

寻鲸AI是一款功能强大的人工智能写作工具,支持对话提问、内置多场景写作模板如写作辅助类、营销推广类等,更能一键写作各类策划方案。

寻鲸AI 68
查看详情 寻鲸AI
  • 返回 bool + 输出参数(不够直观)
  • 抛出异常(开销大,控制流不清晰)
  • 使用 errno 或全局状态(线程不安全)
  • 返回 std::pair<bool, T> 或 std::variant<T, E>(语义模糊)

std::expected 解决了这些问题:

  • 明确区分成功与失败路径
  • 携带详细的错误信息(不只是 true/false)
  • 零成本抽象:没有异常开销
  • 编译期检查:必须处理错误,否则容易被注意到
  • 支持链式操作,如 and_then、or_else 等(类似函数式编程)

如何有效使用 std::expected

实际开发中,建议这样使用:

  • 对于可能失败但属于正常流程的操作(如文件读取、网络请求、数据解析),优先考虑返回 expected
  • 错误类型 E 推荐使用枚举或轻量错误结构体,避免 string(除非调试需要)
  • 配合 if-else 或 switch 处理分支,代码可读性
  • 利用其隐式布尔转换简化判断:if (auto res = compute(); res) { ... }

还支持一些便捷操作:

// 链式处理
get_user_id()
    .and_then(fetch_user_data)
    .or_else([](const auto& e) {
        log_error(e);
        return default_user();
    });
登录后复制

注意事项与现状

目前(截至主流编译器2024年版本),std::expected 在 GCC 13+、Clang 17+ 中已部分支持,需启用 -std=c++23 并注意标准库实现进度。MSVC 正在跟进。

若暂不可用,可使用 TL::expected 第三方库作为过渡,接口高度兼容。

基本上就这些。std::expected 让 C++ 的错误处理变得更直接、更可靠,是现代 C++ 值得掌握的重要工具

以上就是C++23的std::expected是什么_C++中优雅处理函数返回值与错误的现代方法的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号