std::expected是C++23引入的用于安全处理可能失败操作的模板类,它封装成功值或错误信息,提供类型安全、显式错误处理,避免异常开销,适用于嵌入式与高可靠性场景。

在C++23中,std::expected 被正式引入作为标准库的一部分,用于更安全、更清晰地处理可能失败的操作。它提供了一种类型安全的方式来表示一个值或一个错误,取代传统的异常抛出或返回错误码的方式,尤其适合在不希望使用异常的项目中进行可靠错误处理。
什么是 std::expected?
std::expected 是一个模板类,表示要么包含一个类型为 T 的期望值(成功情况),要么包含一个类型为 E 的错误信息(失败情况)。这类似于函数式语言中的 Result 类型,也与 std::optional 类似,但能携带具体的错误原因,而不仅仅是“有值”或“无值”。
相比以下方式:
用返回值表示结果,通过输出参数带回错误码 —— 不直观且易出错抛出异常 —— 在禁用异常的环境(如嵌入式)不可用,性能开销大使用 std::optional + 全局错误状态 —— 无法传递具体错误信息
std::expected 提供了更现代、更安全的替代方案。
立即学习“C++免费学习笔记(深入)”;
基本用法示例
下面是一个使用 std::expected 实现整数除法的简单例子:
#include #include #includestd::expected divide(int a, int b) {if (b == 0) {return std::unexpected("除数不能为零");}return a / b;}
int main() {auto result = divide(10, 2);if (result.has_value()) {std::cout << "结果: " << result.value() << "n";} else {std::cout << "错误: " << result.error() << "n";}
auto bad_result = divide(10, 0);if (!bad_result) { std::cout << "错误: " << bad_result.error() << "n";}
}
在这个例子中:
成功时返回 std::expected 包含结果值失败时通过 std::unexpected(err) 构造错误分支使用 has_value() 或隐式转换判断是否成功通过 .value() 获取正常值,.error() 获取错误信息
错误类型的选取建议
选择合适的错误类型 E 很重要。常见做法包括:
使用枚举类型(如 enum class ErrorCode)提高性能和类型安全使用 std::string 或 std::string_view 方便调试和日志输出结合 std::error_code 与自定义错误类别,实现与现有系统集成
例如:
enum class ParseError { InvalidSyntax, Overflow};std::expected parse_int(const std::string& str) {// ... 解析逻辑if (/ 格式错误 /) {return std::unexpected(ParseError::InvalidSyntax);}if (/ 溢出 /) {return std::unexpected(ParseError::Overflow);}return parsed_value;}
链式操作与映射错误
虽然当前标准尚未提供像 .and_then() 或 .or_else() 这样的函数式组合方法(预计后续标准加入),但你可以手动实现简洁的链式调用:
auto result = compute_a();if (!result) return result;auto next = compute_b(result.value());if (!next) return std::unexpected(next.error());
return next;
与异常的对比与选择
std::expected 并非要完全取代异常,而是提供另一种选择:
当你希望错误处理显式可见、编译期检查时,用 expected当错误是真正异常的、罕见的情况,且项目允许异常时,仍可用 throw/catch在资源受限或禁用异常的环境中,expected 是更优解
它的优势在于:
零成本抽象:没有异常机制的运行时开销强制错误检查:调用者必须处理失败可能支持移动语义和任意可构造类型
基本上就这些。std::expected 让 C++ 的错误处理更加现代化和安全,特别适合系统编程、库开发和高可靠性场景。
以上就是c++++怎么使用C++23的std::expected进行错误处理_C++23新特性与安全错误处理的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1484304.html
微信扫一扫
支付宝扫一扫