std::optional用于表示可能无值的对象,需包含头文件,可声明为空或赋值,通过has_value()或bool转换判断是否有值,使用value()、value_or()或解引用获取值,支持emplace就地构造,常用于查找等可能失败的操作,避免魔法值,提升代码安全性和可读性。

在C++17中引入的std::optional是一个模板类,用于表示一个可能有值、也可能没有值的对象。它非常适合用来处理那些可能失败或不存在结果的操作,比如查找、解析、函数返回值等场景。
std::optional的基本用法
使用std::optional前需要包含头文件:
#include
声明一个可选对象:
立即学习“C++免费学习笔记(深入)”;
- std::optional
opt; // 初始为空 - std::optional
price = 19.99; // 包含值 - std::optional<:string> name = std::nullopt; // 显式设为空
判断是否有值:
- if (opt.has_value()) { ... }
- if (opt) { ... } // 支持bool转换
获取值(需确保有值):
- int val = opt.value(); // 若无值则抛出异常
- int val = opt.value_or(0); // 无值时返回默认值
- int val = *opt; // 解引用,但必须有值,否则未定义行为
构造与赋值操作
支持多种方式创建和赋值:
- std::optional
a{5}; - a = std::nullopt; // 清空
- a = 10; // 赋新值
- std::optional<:p style="color:#f60; text-decoration:underline;" title="ai" href="https://www.php.cn/zt/17539.html" target="_blank">air
> range = std::make_pair(1, 10);
也可以使用emplace就地构造复杂类型:
opt.emplace(3.14, "pi"); // 若opt是tuple或自定义类型的optional
实际应用场景示例
常见于函数返回可能失败的情况:
std::optional
for (size_t i = 0; i
if (vec[i] == target) return i;
}
return std::nullopt;
}
调用时安全处理:
auto result = find_index(data, 42);
if (result) {
std::cout
} else {
std::cout
}
注意事项与最佳实践
避免直接解引用空optional;优先使用value_or提供默认值。
不要用std::optional替代指针做性能敏感场景的优化——它有一定开销。
适合代替“魔法值”如-1、nullptr等语义模糊的“无值”表达。
对于大型对象,考虑是否配合std::unique_ptr或引用包装器使用。
基本上就这些。std::optional让代码更清晰、更安全,减少因空值导致的运行时错误。









