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

c++23中的std::expected是什么以及如何使用_c++错误处理新方案详解

尼克
发布: 2025-11-14 19:24:06
原创
212人浏览过
std::expected<T, E>是C++23引入的模板类,用于显式表示操作可能返回T类型值或E类型错误,相比错误码和异常更安全高效。它通过has_value()、value()、error()等成员函数提供清晰的错误处理机制,并支持and_then、or_else、transform等链式组合操作,使错误处理更现代、类型安全且无需异常开销。

c++23中的std::expected是什么以及如何使用_c++错误处理新方案详解

std::expected 是 C++23 引入的一个新类型,用于更清晰、更安全地处理可能失败的操作。它提供了一种比异常和错误码更现代的错误处理方式,尤其适合函数可能返回正常值或错误信息的场景。

什么是 std::expected?

std::expected<T, E> 是一个模板类,表示“期望得到一个 T 类型的值,但可能会得到一个 E 类型的错误”。它类似于 std::optional<T>(可能有值或无值),但不同之处在于:当没有正常值时,它不是“空”,而是包含一个具体的错误对象(E 类型)。

这使得调用者能明确知道操作失败的原因,而不是仅仅判断“有没有结果”。

与传统错误处理方式对比

• 返回错误码:需要额外的输出参数或全局变量(如 errno),容易忽略检查。
• 抛出异常:性能开销大,控制流不明显,不适合高频调用或系统级代码。
• std::optional:只能表达“有值/无值”,无法说明为何无值。
• std::expected:既能返回成功值,也能携带具体错误,类型安全且无需异常支持。

基本使用方法

假设我们要实现一个除法函数,可能因除零而失败:

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

#include <expected><br>#include <iostream><br><br>enum class DivideError {<br>    DivisionByZero<br>};<br><br>std::expected<double, DivideError> divide(double a, double b) {<br>    if (b == 0.0) {<br>        return std::unexpected(DivideError::DivisionByZero);<br>    }<br>    return a / b;<br>}<br><br>int main() {<br>    auto result = divide(10.0, 2.0);<br>    if (result.has_value()) {<br>        std::cout << "Result: " << result.value() << "
";<br>    } else {<br>        std::cout << "Error: Division by zero
";<br>    }<br><br>    auto bad_result = divide(5.0, 0.0);<br>    if (!bad_result) {<br>        if (bad_result.error() == DivideError::DivisionByZero) {<br>            std::cout << "Caught division by zero
";<br>        }<br>    }<br>    return 0;<br>}
登录后复制

挖错网
挖错网

一款支持文本、图片、视频纠错和AIGC检测的内容审核校对平台。

挖错网 28
查看详情 挖错网

关键成员函数:
• has_value():检查是否包含正常值。
• value():获取成功值(若无值则抛异常,慎用)。
• operator*:解引用获取值(需确保有值)。
• error():获取错误对象。
• operator bool():可直接用于条件判断。

链式处理与辅助操作

可以结合 lambda 或函数指针做链式调用,类似 Rust 的 ? 操作符思想:

std::expected<int, std::string> parse_number(const std::string& s) {<br>    try {<br>        return std::stoi(s);<br>    } catch (...) {<br>        return std::unexpected("Invalid number format");<br>    }<br>}<br><br>auto result = parse_number("42")<br>    .and_then([](int n) -> std::expected<int, std::string> {<br>        if (n < 0) return std::unexpected("Negative not allowed");<br>        return n * 2;<br>    });<br><br>if (result) {<br>    std::cout << "Parsed and doubled: " << *result << "\n";<br>} else {<br>    std::cout << "Error: " << result.error() << "\n";<br>}
登录后复制

常用组合方法:
• and_then(func):值存在时执行转换函数。
• or_else(func):值不存在时提供回退逻辑。
• transform(func):对值进行映射(返回 expected)。

基本上就这些。std::expected 让错误处理变得显式、类型安全且易于组合,是 C++23 中值得掌握的新特性。

以上就是c++++23中的std::expected是什么以及如何使用_c++错误处理新方案详解的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源: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号