std::optional比pair更清晰表达“可能无值”语义,避免哨兵值和空指针问题,支持安全解包、默认回退与移动优化,且具备编译期类型安全。
std::optional比返回pair更清晰地表达“可能无值”语义
用 std::optional<t></t> 作返回值,直接告诉调用者:这个函数要么成功返回一个 T,要么什么也不返回(不是异常,也不是默认构造的假值)。不像 std::pair<bool t></bool> 那样需要手动检查 .first,也避免了用哨兵值(比如 -1、nullptr)带来的歧义和类型不安全。
常见错误现象:返回 T* 或 T& 时,调用方容易忽略空指针检查;返回 T 加额外 bool* 输出参数,接口臃肿且易被忽略。
- 调用方只需用
if (auto res = func()) { use(*res); },语义一目了然 - 不能隐式转换为
bool,必须显式调用has_value()或用if (opt)(依赖上下文转换),减少误用 - 移动语义友好:返回临时
std::optional<bigstruct></bigstruct>不会触发深拷贝,比传引用+输出参数更高效
避免异常开销又不牺牲错误可追溯性
在性能敏感路径(如高频解析、配置读取)中,抛异常代价高且不可控。而 std::optional 把“失败”降级为值语义,调用方可以按需决定是立即处理、传播还是静默跳过。
使用场景:配置项缺失、JSON 字段不存在、缓存未命中、数值解析失败(如 std::stoi 的替代封装)。
立即学习“C++免费学习笔记(深入)”;