新闻中心
C++23中的std::expected怎么用_C++错误处理与std::expected使用
std::expected 是C++23引入的用于显式处理预期错误的类型,它能安全携带成功值或错误信息。相比异常和 optional,它避免了异常开销且能表达具体错误原因。通过 .has_value()、.value()、.error() 等方法可安全访问结果,支持默认值回退和链式判断,适用于除法、字符串解析等可能失败的操作,提升代码健壮性。

在C++23中,std::expected 被正式引入作为处理预期结果或错误的标准化方式。它比传统的异常和返回码更灵活、更安全,尤其适合那些可能失败但又不值得抛出异常的函数。
什么是 std::expected?
std::expected
举个例子:一个除法函数可以返回结果,也可以返回一个错误码说明“除零”:
#include <expected>
#include <iostream>
enum class MathError {
DivisionByZero
};
std::expected<double, MathError> divide(double a, double b) {
if (b == 0.0) {
return std::unexpected(MathError::DivisionByZero);
}
return a / b;
}
调用时可以清晰地判断是否成功:
auto result = divide(10, 0);
if (result.has_value()) {
std::cout << "Result: " << result.value() << "\n";
} else {
std::cout << "Error: Division by zero\n";
}
如何检查结果和提取值?
std::expected 提供了几种方式来访问内部值或处理错误:
- .has_value():判断是否包含正常值
- .value():获取值,若无值则抛出异常(基于 E 构造)
- .error():当出错时,获取错误对象
- .value_or(default):有值则返回,否则返回默认值(仅当 E 可构造时可用)
示例:
auto res = divide(5, 2);
if (res) {
std::cout << res.value(); // 输出 2.5
} else {
if (res.error() == MathError::DivisionByZero) {
std::cout << "Cannot divide by zero.";
}
}
与异常和 optional 的对比
相比传统方式,std::expected 更明确地表达了“可预期的失败”:
易标AI
告别低效手工,迎接AI标书新时代!3分钟智能生成,行业唯一具备查重功能,自动避雷废标项
135
查看详情
- 异常:开销大,控制流跳转隐式,不适合高频调用或性能敏感场景
- std::optional:只能表示“有/无”,无法说明为何失败
- std::expected:显式携带错误信息,不依赖异常机制,类型安全
比如解析字符串为整数:
std::expected<int, std::string> try_parse_int(const std::string& s) {
try {
size_t pos;
int value = std::stoi(s, &pos);
if
(pos != s.size()) {
return std::unexpected("Invalid characters at end");
}
return value;
} catch (...) {
return std::unexpected("Parse failed");
}
}
链式处理与 map/or_else 模式(模拟)
虽然 C++23 标准库未直接提供 map 或 and_then 方法,但你可以手动组合使用。
例如连续解析两个数并相加:
auto a = try_parse_int("42");
auto b = try_parse_int("abc");
if (a && b) {
std::cout << "Sum: " << (a.value() + b.value()) << "\n";
} else {
if (!a) std::cout << "First parse failed: " << a.error() << "\n";
if (!b) std::cout << "Second parse failed: " << b.error() << "\n";
}
你也可以封装辅助函数实现类似函数式风格的处理逻辑。
基本上就这些。std::expected 让错误处理变得更直观、更安全,尤其是在系统编程、配置解析、IO操作等常见场景中非常实用。不复杂但容易忽略细节,比如正确使用 std::unexpected 来包装错误。用好它,代码会更健壮。
以上就是C++23中的std::expected怎么用_C++错误处理与std::expected使用的详细内容,更多请关注其它相关文章!
# 如何实现
# 汉中推广网站
# 西坞海外营销推广
# 唐山市政府网站建设公告
# 细河区关键词seo排名优化
# 煤机市场营销推广文案范文
# 广元百度网站推广
# 网络营销和推广公司名称
# 金堂找人做seo哪里有
# 标准化网站优化公司排名
# 江苏seo优化怎么收费
# 库中
# 默认值
# 游戏开发
# c++23
# 抛出
# 重写
# 数据结构
# 错误信息
# 如何使用
# 链式
# 标准库
# 字符串解析
# stream
# ios
# c++
# ai
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
WordPress插件开发:正确注册卸载钩子与避免常见陷阱
谷歌学术网站直达地址 谷歌学术搜索网页版一键进入
J*aScript map 迭代中检测空数组元素的有效方法
《刺客信条4:黑旗》重制版新细节曝光:无缝加载 地图更细致!
HTML元素状态管理:根据DIV内容动态启用/禁用按钮
vivo浏览器自带的下载器速度慢怎么办 vivo浏览器提升文件下载速度的技巧
向日葵客户端怎么进行远程CentOS控制_向日葵客户端远程CentOS控制操作教程
NRF24L01数据传输深度解析:解决大载荷接收异常与分包策略
黑猫投诉统一入口官网 消费者权益保护投诉平台
Node.js CSV 数据处理:基于字段空值条件过滤整条记录的策略
天眼查企业查询官网入口 天眼查官方网页版查询
Pyrogram与g4f集成:异步编程实践与常见错误解决
MinIO大规模对象列表性能瓶颈深度解析与外部元数据管理策略
qq游戏大厅官方下载_qq游戏免费下载安装入口
LINQ to XML为何解析失败? 深入理解C# XDocument的异常处理
HTML转PPT成品工具有哪些?HTML网页转PPT成品工具大全
qq邮箱日历功能怎么用_创建日程与会议邀请的技巧
俄罗斯Yandex免登录入口_Yandex搜索引擎官网一键直达
C++如何使用AddressSanitizer(ASan)_C++调试工具中检测内存访问错误的利器
Node.js 中使用 node-cron 实现定时 API 数据抓取与处理
高德地图沿途添加点失败如何解决 高德多点规划方法
html两个JS只运行一个怎么办_让双JS在html中都运行方法【技巧】
在哪找SublimeJ远程工具_SFTP插件配置教程
Golang如何优化CPU绑定任务分配策略_Golang CPU任务分配优化实践
照顾宝贝2小游戏点击立即在线玩
品牌机怎么重装系统 联想/戴尔/惠普笔记本恢复出厂系统教程
win11如何加载ICC颜色配置文件 Win11校色文件安装与显示器色彩管理【指南】
Promise错误处理:在catch后终止链式then执行的策略
Golang如何测试channel通信行为_Golang channel通信测试与分析方法
在J*a项目里如何构建对象之间的契约_接口约束的实际落地
c++中的std::basic_string的SSO优化_c++短字符串优化深度解析
J*a递归快速排序中静态变量导致数据累积问题的解决方案
CSS Flexbox如何实现多行排列_flex-wrap wrap自动换行显示
Surface怎么安装系统 微软Surface Pro U盘重装win11教程
优化 Jest 模拟:强制未实现函数抛出错误以提升测试效率
谷歌浏览器最新官方入口链接 谷歌浏览器网页版官网导航
特斯拉自动驾驶房车计划曝光 原型车将于2027年亮相
CSS子选择器:如何区分并样式化嵌套列表的子层级
c++中的std::launder有什么实际用途_c++对象生命周期与指针优化
LocoySpider如何部署到云服务器_LocoySpider云部署的远程配置
单12V-2×6实现为RTX 5090供电750W!甚至都没敢跑分
Django表单提交验证失败后保持字段值不刷新
b站怎么取消点赞_b站点赞取消操作方法
sublime如何配置Python开发环境_将sublime打造成轻量级Python IDE
谷歌邮箱网页版官方页面入口 谷歌邮箱网页端快速访问
Python模块化编程:有效管理依赖与避免循环引用
J*a里如何使用N*igableMap进行导航操作_可导航Map操作技巧解析
Golang如何优雅处理error_Golang error处理最佳实践总结
如何设置Windows Defender的定时扫描_计划任务实现自动杀毒【安全】
win11专注助手在哪 Win11免打扰模式设置与自动化规则【指南】


2025-11-09
浏览次数:次
返回列表
(pos != s.size()) {
return std::unexpected("Invalid characters at end");
}
return value;
} catch (...) {
return std::unexpected("Parse failed");
}
}