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

std::expected 是 C++23 引入的一个新类型,用于更清晰、更安全地处理可能失败的操作。它提供了一种比异常和错误码更现代的错误处理方式,尤其适合函数可能返回正常值或错误信息的场景。
std::expected<T, E> 是一个模板类,表示“期望得到一个 T 类型的值,但可能会得到一个 E 类型的错误”。它类似于 std::optional<T>(可能有值或无值),但不同之处在于:当没有正常值时,它不是“空”,而是包含一个具体的错误对象(E 类型)。
这使得调用者能明确知道操作失败的原因,而不是仅仅判断“有没有结果”。
假设我们要实现一个除法函数,可能因除零而失败:
立即学习“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>}关键成员函数:
• 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++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号