std::expected 与错误处理
更新时间:2026-10-01。与 06 异常安全、24 optional 构成完整错误处理图景。
一、它解决什么
cpp
expected<int, Error> parse(...);
if (!r) { log(r.error()); return; }
int v = *r;
r.and_then(step1).transform(step2).or_else(recover);成功/失败都在类型签名里,调用方必须面对错误,且 E 能带原因,不像 optional 那样“为什么没有”丢失。
二、范式选择

输入校验等“预期失败”更适合 expected;嵌入式/游戏/实时常禁用异常,expected 成为主力;底层系统调用仍常用错误码。
常见坑
- 忽略返回值/不检查错误(可用 warn_unused)。
- 用 optional 表达需要原因的失败。
- 把异常当普通控制流到处抛。
小结
总结
std::expected<T,E>(C++23,对应 Rust 的 Result)在类型签名里显式携带"成功值或带原因的错误",不抛异常、不会像 optional 那样丢失"为什么失败",并强制调用方面对错误,还能用 and_then/transform/or_else 做链式(monadic)处理;选型上——罕见且需跨层传播的真正异常用异常,输入校验这类"预期失败"以及嵌入式/游戏/实时等禁用异常的场景用 expected,只表示"可能没有"用 optional,底层系统调用互操作仍常用错误码,且不要把异常当普通控制流到处抛。