首页 > 后端开发 > C++ > 正文

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

穿越時空
发布: 2025-10-30 19:50:01
原创
960人浏览过
c++kquote>std::expected<T, E> 是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> 是一个类模板,表示“期望得到一个类型为 T 的值,否则得到一个类型为 E 的错误”。它类似于函数式语言中的 Either 类型,但专为“结果或错误”场景设计。

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

基本用法示例

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

立即学习C++免费学习笔记(深入)”;

#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++)。

法语写作助手
法语写作助手

法语助手旗下的AI智能写作平台,支持语法、拼写自动纠错,一键改写、润色你的法语作文。

法语写作助手31
查看详情 法语写作助手
  • 使用 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用法解析的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

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