You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中std::expected是什么?其定义与用法相关问题咨询

std::expected 核心说明

为什么你之前在cppreference搜不到

std::expected 是C23版本才正式加入C标准库的组件,如果你查看的是C++20及更早版本的cppreference文档,自然不会有相关条目。

基础定义

std::expected 是用于错误处理的词汇类型模板,设计思路和std::optional、std::variant同源,核心作用是包装函数的返回结果:一个std::expected<T, E>类型的对象,要么存储你预期的正常返回值(类型为T),要么存储意外发生的错误信息(类型为E),完全不需要依赖异常抛出、全局错误码、特殊哨兵返回值(比如用-1、空指针代表错误)这类传统错误处理方案。

基础用法示例

举个简单的读取文件的函数例子:

// 模板参数1是正常返回的文件内容类型,参数2是错误码类型
std::expected<std::string, int> read_file(const std::string& path) {
    std::ifstream file(path);
    if (!file.is_open()) {
        // 出错时返回unexpected包装的错误码
        return std::unexpected(errno);
    }
    // 正常执行返回预期的字符串内容
    return std::string(std::istreambuf_iterator<char>(file), {});
}

// 调用侧使用方式
int main() {
    auto res = read_file("test.txt");
    if (res) {
        // 有值时解引用拿到正常返回结果
        std::cout << "文件内容:" << *res << std::endl;
    } else {
        // 出错时调用error()拿到错误信息
        std::cerr << "读取失败,错误码:" << res.error() << std::endl;
    }
    return 0;
}

核心优势

  • 类型安全,返回值和错误信息强绑定,不会出现错误码被使用者无意忽略的问题
  • 不需要依赖异常机制,完美适配禁用异常的嵌入式、高性能计算场景
  • 代码可读性强,错误处理逻辑和正常业务逻辑的边界清晰

补充:在C23正式标准化之前,已有大量第三方库提供了相同设计的实现,比如Boost.Outcome、Abseil的AbslStatusOr,你之前在C20相关的Stack Overflow回答中看到的用法,要么是当时还在迭代的标准化提案版本,要么就是这类第三方实现的内容。

内容的提问来源于stack exchange,提问作者Fedor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 04:42:02