在 C++17 中,std::optional
是一个非常有用的类型,它用于封装一个可能不存在的值。它提供了一种安全的方式来处理可能为空的值,避免了使用 NULL
或 nullptr
带来的问题。
以下是 std::optional
的一些基本用法:
-
创建
std::optional
对象:- 使用
std::nullopt
或std::make_optional
创建一个空的std::optional
。 - 使用值初始化创建一个非空的
std::optional
。
std::optional<int> opt1 = std::nullopt; // 创建一个空的optional std::optional<int> opt2 = std::make_optional(10); // 创建一个包含10的optional std::optional<int> opt3(20); // 创建一个包含20的optional
- 使用
-
访问
std::optional
的值:- 使用
*
运算符或->
运算符访问值。 - 使用
value()
方法访问值,如果optional
是空的,则抛出std::bad_optional_access
异常。
if (opt3.has_value()) { std::cout << *opt3 << std::endl; // 输出20 int value = opt3.value(); // 获取值 } else { std::cout << "opt3 is empty" << std::endl; }
- 使用
-
检查
std::optional
是否有值:- 使用
has_value()
方法检查optional
是否包含值。
if (opt3.has_value()) { std::cout << "opt3 has a value" << std::endl; } else { std::cout << "opt3 is empty" << std::endl; }
- 使用
-
赋值和重置:
- 可以给
optional
赋值,也可以使用reset()
方法将其重置为无值状态。
opt3 = 30; // 赋值 opt3.reset(); // 重置为无值
- 可以给
-
使用
std::optional
作为函数参数和返回类型:- 可以将
optional
用作函数参数,表示函数可以返回一个可选的值。 - 可以将
optional
用作函数的返回类型,表示函数可以返回一个可选的结果。
std::optional<int> find_value(const std::vector<int>& vec, int value) { for (int v : vec) { if (v == value) { return v; } } return std::nullopt; } int main() { std::vector<int> vec = {1, 2, 3, 4, 5}; auto result = find_value(vec, 3); if (result.has_value()) { std::cout << "Found value: " << *result << std::endl; } else { std::cout << "Value not found" << std::endl; } return 0; }
- 可以将
-
比较
std::optional
对象:- 可以比较两个
optional
对象,如果它们都包含值,则比较这些值;如果其中一个为空,则比较结果取决于另一个optional
是否为空。
std::optional<int> opt4(10); std::optional<int> opt5(20); std::optional<int> opt6 = std::nullopt; if (opt4 == opt5) { std::cout << "opt4 and opt5 have the same value" << std::endl; } else if (opt4 == opt6) { std::cout << "opt4 is empty or has the same value as opt6" << std::endl; } else { std::cout << "opt4 and opt5 have different values" << std::endl; }
- 可以比较两个
通过这些基本用法,你可以在 C++ 中更安全、更灵活地处理可能为空的值。