0

0

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

尼克

尼克

发布时间:2025-11-14 19:24:06

|

272人浏览过

|

来源于php中文网

原创

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() << "\n";
} else {
std::cout << "Error: Division by zero\n";
}

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

arXiv Xplorer
arXiv Xplorer

ArXiv 语义搜索引擎,帮您快速轻松的查找,保存和下载arXiv文章。

下载

关键成员函数:
• 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++系统编程内存管理_C++系统编程怎么与Rust竞争内存安全
C++系统编程内存管理_C++系统编程怎么与Rust竞争内存安全

C++系统编程中的内存管理是指 对程序运行时内存的申请、使用和释放进行精细控制的机制,涵盖了栈、堆、静态区等不同区域,开发者需要通过new/delete、智能指针或内存池等方式管理动态内存,以避免内存泄漏、野指针等问题,确保程序高效稳定运行。它核心在于开发者对低层内存有完全控制权,带来灵活性,但也伴随高责任,是C++性能优化的关键。

9

2025.12.22

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

184

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

265

2023.10.25

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

73

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

96

2025.09.18

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

202

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

189

2025.11.08

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

65

2025.12.31

php网站源码教程大全
php网站源码教程大全

本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

44

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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