C++ Std::nullopt

2024 年 8 月 29 日 | 4 分钟阅读

在本文中,您将通过示例了解 C++ 中的 std::nullopt 函数。它最初包含在 C++17 标准中。std::nullopt 是 C++ 中的一个常量,主要与 std::optional 结合使用,表示值的缺失。以下是关于 std::nullopt 的一些理论:

  1. 可选值: std::optional 类模板表示可选值,这些值可能存在也可能不存在。std::optional 是一种比指针或哨兵值(例如 -1 或 nullptr)更具表达性和安全性的解决方案,用于表示缺失值。
  2. std::nullopt 的必要性: 在引入 std::nullopt 之前,在使用可选类型时,开发人员必须依赖约定或使用各种哨兵值来表示值的缺失。通过 std::nullopt,可以采用一种一致且易于理解的方法来表达这种缺失。
  3. 缺失的再现: 当一个 std::optional 对象在没有为其赋值的情况下创建时,它处于分离状态。它表示它是空的,并且可以使用 std::nullopt 明确表示这种情况。
  4. std::nullopt 的引入: 在 C++17 之前,人们倾向于通过使用约定、特殊值(如 -1)或空指针来表达值的缺失,所有这些都可能导致错误。std::nullopt 的添加提供了一种标准化且明确的方式来指示可选值为空。
  5. 用途和目的: std::nullopt 用于表示 std::optional 对象(一个可选值的可为空容器)中缺少值。它使您能够区分 空状态有效值。在处理可选或可空类型时,同时维护类型安全,它非常重要。
  6. 类型安全: 通过将 std::nullopt 与 std::optional 结合使用来实现类型安全。可以区分空的可选值和具有有效值的可选值,并且编译器有助于强制执行此区别。
  7. 比较和测试: 您可以将其与 std::nullopt 进行比较,以确定 std::optional 是否具有值。例如,您可以直接与 optionalVar == std::nullopt 进行比较,或使用 has_value()。
  8. 用例: std::nullopt 在多种情况下都很有用,包括错误处理、可能返回空结果的函数以及可选配置选项。在没有有用的值可处理时,它有助于提供明确的指示。
  9. 更清晰的代码: 使用 std::nullopt 的代码更具自文档性和直观性。它阐明了函数何时可能无法提供有效结果,或者变量何时可能为空。

示例

让我们举一个例子来说明 C++ 中 std::nullopt 的用法

输出

Division by zero is not possible.

说明

  1. #include <iostream> 和 #include <optional>: 这些行包含输入/输出操作所需的可选值和库。
  2. std::optional 中的 Divide(int a, int b): 此函数尝试通过将 a 除以 b 来除两个整数输入 a 和 b。如果除数 b 为零,它将返回 std::nullopt,表示无法进行除法。如果 b 不为零,它将返回除法的结果。
  3. int main(): 它是程序执行开始的主函数。
  4. 接下来是 int a = 10; 和 int b = 0;,将两个整数变量 a 和 b 初始化为 10 和 0。
  5. auto result = divide(a, b);: 此行使用参数 a 和 b 调用除法函数后,结果存储在 result 变量中。返回 std::nullopt 表示无法进行除法,或者 b 为 0。
  6. if (result.has_value()): 之后,代码使用 result.has_value() 检查 'result' 是否有值。如果 'result' 有值,它会使用 result.value() 打印结果。如果 'result' 没有值(表示除以零),它会打印一条错误消息。
  7. 除法结果是 "" \\ result.value() \\ std::endl;: 如果可以进行除法,此行会将除法结果写入控制台。
  8. std::cout << "Division by zero is not possible." << std::endl;: 如果无法进行除法,此行会将相应的消息打印到控制台。
  9. return 0;: 此行向操作系统返回 0,表明程序已成功执行。