std::optional 是 C++17 引入的用于明确表达“可能有值也可能无值”的工具,适用于函数本应返回对象但某些条件下无法构造有效结果的场景,如 map 查找失败、字符串解析非法、配置未设置等;它替代哨兵值和裸指针,不替代异常或 bool+输出参数;需注意类型限制(不可为引用/数组/void)、内存开销及避免嵌套。
std::optional 是 C++17 引入的标准库工具,用于明确表达“可能有值,也可能没有值”的语义,替代裸指针、特殊哨兵值(如 -1、nullptr)或自定义包装类来表示可选返回值。
适用于函数**本应返回一个对象,但某些条件下无法构造有效结果**的场景。典型例子:
它不是用来替代 bool 返回 + 输出参数,也不是替代异常处理(错误/异常仍该用 exception)。
声明一个可能为空的 int:
std::optional
std::optional
std::optional
检查并安全访问:
例如安全查找 map 中的值:
std::optional<:string> find_name(const std::map
auto it = db.find(id);
if (it != db.end()) return it->second; // 自动转换为 optional
return std::nullopt; // 或直接 return {};
}
调用方清晰表达意图:
auto name = find_name(db, 123);
if (name) {
std::cout
} else {
std::cout
}
std::optional 让“有没有值”成为类型系统的一部分,调用方无法忽略缺失情况,显著提升接口健壮性与可读性。