C++ 面试题
目录

C++17 中 std::optional 的用法?

· 约 3 分钟读完 · 第 132 / 181 章

推荐答案

本题详细解读

std::optional 简介

std::optional 是 C++17 引入的一个模板类,用于表示一个可能包含值或可能不包含值的对象。它通常用于函数返回值,表示函数可能返回一个有效值,也可能返回一个无效值(即空值)。

主要用法

  1. 创建 std::optional 对象:

    • 可以通过直接赋值或使用 std::make_optional 来创建 std::optional 对象。
    • 例如:std::optional<int> opt = 42; 或 auto opt = std::make_optional(42);
  2. 检查是否有值:

    • 使用 has_value() 或直接使用 if (opt) 来检查 std::optional 是否包含有效值。
    • 例如:if (opt.has_value()) { /* 有值 */ } 或 if (opt) { /* 有值 */ }
  3. 获取值:

    • 使用 value() 方法或解引用操作符 * 来获取 std::optional 中的值。
    • 例如:int val = opt.value(); 或 int val = *opt;
  4. 返回空值:

    • 使用 std::nullopt 来表示 std::optional 不包含任何值。
    • 例如:return std::nullopt;

示例代码解析

  • divide 函数返回一个 std::optional<int>,表示除法运算的结果。如果除数为零,则返回 std::nullopt,表示无效值。
  • 在 main 函数中,首先调用 divide(10, 2),返回一个包含有效值的 std::optional,然后通过 has_value() 和 value() 方法获取并输出结果。
  • 接着调用 divide(10, 0),返回一个空值 std::nullopt,通过 if (result) 检查并输出错误信息。

注意事项

  • 使用 value() 方法时,如果 std::optional 为空,会抛出 std::bad_optional_access 异常。因此,在使用 value() 之前,最好先检查 has_value()。
  • std::optional 可以用于任何类型的对象,包括自定义类型和标准库类型。