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
相关产品推荐
相关产品推荐

