C++17 std::optional:优雅处理可能缺失的值
学习optional的构造、访问和错误处理,替代指针或哨兵值表示可选结果。 · 难度:入门 · +15XP
什么是std::optional?
std::optional是一个容器,它可能包含一个值,也可能为空。它用于表示一个可能失败的函数结果或可选参数,比使用指针或特殊标记更安全。
基本用法
#include <optional>
#include <iostream>
#include <string>
std::optional<std::string> find_user(int id) {
if (id == 1)
return "Alice";
else
return std::nullopt; // 或 {}
}
int main() {
auto result = find_user(1);
if (result) // 或 result.has_value()
std::cout << *result << '
'; // 解引用
else
std::cout << "Not found
";
}
访问值
| 方法 | 说明 |
|---|---|
has_value() | 检查是否包含值 |
value() | 返回值或抛出std::bad_optional_access |
value_or(default) | 返回值或默认值 |
operator* / operator-> | 解引用(未检查) |
std::optional<int> opt = 42;
std::cout << opt.value_or(0) << '
'; // 42
opt = std::nullopt;
std::cout << opt.value_or(-1) << '
'; // -1与错误处理
std::optional适合不需要错误信息的场景。如果需要错误原因,考虑std::expected(C++23)。
练习提示
编写一个函数safe_divide,接受两个double参数,如果除数为0则返回std::nullopt,否则返回商。在main中测试。