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

std::expected是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 类型的错误”。它类似于 std::optional(可能有值或无值),但不同之处在于:当没有正常值时,它不是“空”,而是包含一个具体的错误对象(E 类型)。

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

与传统错误处理方式对比

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

基本使用方法

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

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

#include 
#include

enum class DivideError {
DivisionByZero
};

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

int main() {
auto result = divide(10.0, 2.0);
if (result.has_value()) {
std::cout << "Result: " << result.value() << "";
} else {
std::cout << "Error: Division by zero";
}

auto bad_result = divide(5.0, 0.0);
if (!bad_result) {
if (bad_result.error() == DivideError::DivisionByZero) {
std::cout << "Caught division by zero";
}
}
return 0;
}

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

链式处理与辅助操作

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

std::expected parse_number(const std::string& s) {
try {
return std::stoi(s);
} catch (...) {
return std::unexpected("Invalid number format");
}
}

auto result = parse_number("42")
.and_then([](int n) -> std::expected {
if (n < 0) return std::unexpected("Negative not allowed");
return n * 2;
});

if (result) {
std::cout << "Parsed and doubled: " << *result << "n";
} else {
std::cout << "Error: " << result.error() << "n";
}

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1484046.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 07:46:09
下一篇 2025年12月19日 07:46:22

相关推荐

发表回复

登录后才能评论
关注微信