新闻中心

c++怎么使用C++23的std::expected_C++23错误处理新特性std::expected用法解析

2025-10-30
浏览次数:
返回列表
c++kquote>std::expected 是C++23引入的模板类,用于表示操作成功时返回值T或失败时返回错误E,替代异常或错误码。它比optional多出错误信息,支持has_value、value、error等方法,并可结合and_then实现链式错误处理,提升代码健壮性与可读性。

c++怎么使用c++23的std::expected_c++23错误处理新特性std::expected用法解析

从C++23开始,std::expected 被正式纳入标准库,提供了一种更安全、更明确的错误处理方式。它用来表示一个操作可能成功返回值,也可能失败并返回错误信息,替代传统的异常或返回码机制。

什么是 std::expected?

std::expected 是一个类模板,表示“期望得到一个类型为 T 的值,否则得到一个类型为 E 的错误”。它类似于函数式语言中的 Either 类型,但专为“结果或错误”场景设计。

std::optional 不同的是:optional 表示“有值或无值”,而 expected 还能告诉你“为什么没有值”。

基本用法示例

假设我们要写一个除法函数,除零时返回错误码:

#include <expected>
#include <iostream>
#include <string>

std::expected<double, std::string> divide(double a, double b) {
    if (b == 0.0) {
        return std::unexpected("Division by zero");
    }
    return a / b;
}

调用该函数:

auto result = divide(10, 3);
if (result.has_value()) {
    std::cout << "Result: " << result.value() << "\n";
} else {
    std::cout << "Error: " << result.error() << "\n";
}

也可以用结构化绑定(如果支持)或直接解包:

auto result = divide(10, 0);
if (result) {
    std::cout << "Success: " << *result << "\n";
} else {
    std::cout << "Failed: " << result.error() << "\n";
}

如何编译使用 C++23 和 std::expected

目前主流编译器对 std::expected 的支持需要开启 C++23 模式,并使用较新版本的 STL(如 libstdc++ 或 libc++)。

Musho Musho

AI网页设计Figma插件

Musho 76 查看详情 Musho
  • 使用 GCC(建议 13+):
    g++ -std=c++23 -Wall -Wextra source.cpp
    
  • Clang(建议 17+)配合 libc++:
    clang++ -std=c++23 -stdlib=libc++ source.cpp
    

注意:GCC 13 中 libstdc++ 对 std::expected 的支持是实验性的,需定义宏启用:

-D_GLIBCXX_USE_CXX11_ABI=1 -fconcepts

或者使用第三方实现(如 TL::expected)在旧版本中练习语法。

链式错误处理与 map / and_then

std::expected 支持类似 monadic 的操作,便于组合多个可能出错的操作。

例如使用 and_then 实现链式调用:

std::expected<int, std::string> to_int(const std::string& s) {
    try {
        return std::stoi(s);
    } catch (...) {
        return std::unexpected("Invalid number");
    }
}

auto process(const std::string& str) {
    return to_int(str)
        .and_then([](int n) -> std::expected<int, std::string> {
            if (n == 0) return std::unexpected("Zero not allowed");
            return 100 / n;
        });
}

若任意一步失败,后续不会执行,直接传递错误。

基本上就这些。std::expected 让错误处理变得更清晰、更少依赖异常或全局状态,适合现代 C++ 中追求健壮性和可读性的项目。

以上就是c++++怎么使用C++23的std::expected_C++23错误处理新特性std::expected用法解析的详细内容,更多请关注其它相关文章!


# 边缘  # 正定个人网站推广哪家好  # 网站建设托管加工  # 西安医院网站建设  # 丹东个人seo优化优势  # 蚌埠关键词排名收费  # 泉州网站推广企业有哪些  # seo百家论坛  # seo大神都是谁  # 醴陵怎么做营销推广  # 低价网站建设公司外包  # 还能  # 多个  # ai  # 是一个  # 的是  # 返回值  # 错误信息  # 新特性  # 游戏开发  # 链式  # 为什么  # 标准库  # stream  # ios  # c++ 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Angular中父组件异步更新子组件复选框状态的实践指南  在Socket.IO连接中实现Access Token自动更新与动态重连  苹果手机指南针不准怎么校准 传感器校准方法详解【建议收藏】  J*a应用程序首次运行自动创建文件与目录的最佳实践  HTML5原生日期选择器与jQuery UI:实现日期选择器的联动与程序化控制  MongoDB聚合管道:正确匹配对象数组中_id的方法  J*aScript中高效管理与清空动态列表:避免循环陷阱  12306选座怎么选到特殊座位_12306特殊座位选择注意事项  C++ string find函数返回值npos详解_C++字符串查找失败的判断条件  可靠CSGO开箱平台解析 CSGO开箱网合集  优化 Jest 模拟:强制未实现函数抛出错误以提升测试效率  c++ dfs和bfs代码 c++深度广度优先搜索算法  京东单号查询入口_京东快递订单追踪入口  如何更改在 Excel 中打开超链接时的默认浏览器  痛风发作了怎么办? 快速止痛和后期饮食调理  ArrayList与LinkedList核心操作的Big-O复杂度分析  win11专注助手在哪 Win11免打扰模式设置与自动化规则【指南】  sublime怎么设置启动时打开的窗口_sublime会话管理与热退出  深入理解Promise链:如何在catch后中断then的执行  谷歌浏览器一键优化方案_谷歌浏览器直达主页极速不卡版  单射、满射与双射的关系 一文理清所有逻辑  服务端验证_j*ascript输入检查  Win11怎么设置鼠标指针速度_Win11提高鼠标指针精确度选项  AO3官方镜像站点汇总 AO3同人作品网页版直达链接  在哪找SublimeJ远程工具_SFTP插件配置教程  poki网页游戏推荐_poki免费游戏平台入口  文心一言怎样用批量生成做多版文案_文心一言用批量生成做多版文案【批量创作】  win11如何卸载Windows更新补丁 Win11解决更新导致系统不稳定的问题【修复】  处理Kafka消费者会话超时:深入理解消息处理语义与幂等性  Go语言中Map存储的结构体如何调用指针方法:深入解析与实践  如何使用Node.js csv 包按条件移除含空字段的CSV记录  J*a里如何实现线程安全的懒加载单例_懒加载单例实现方法解析  高德地图总提示网络异常怎么办 高德地图离线导航设置与网络排查方法  HTML元素状态管理:根据DIV内容动态启用/禁用按钮  J*a递归快速排序中静态变量导致数据累积的陷阱与解决方案  Shopware订单对象中获取产品自定义字段的正确方法  在Go Martini框架中高效服务动态生成图像的实践指南  UC浏览器官网入口2025最新 UC浏览器网页版正式地址  解决Rails应用中内容错位与Turbo警告:meta标签误用导致富文本渲染异常  照顾宝贝2小游戏点击立即在线玩  如何在 Excel Online 和 Google 表格中更改日期格式  css子元素高度不一致导致布局错位怎么办_使用align-items:stretch解决高度差异  虫虫漫画精品漫画官网_虫虫漫画精品漫画官网进入精品漫画  《刺客信条:影》PS5 Pro和Switch 2画面对比  构建轻量级网站内部消息系统:Formspree 集成指南  我的世界官方游戏入口 我的世界官网平台直达链接  腾讯QQ邮箱登录入口_QQ邮箱官方网站使用地址  Lar*el头像管理:图片缩放与旧文件删除的最佳实践  Excel文件在线转换快速入口 Excel在线格式转换网站  在J*a中如何使用Exception包装底层异常_异常包装与信息传递方法说明 

搜索