C++ 面试题 目录

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

推荐答案

-- -------------------- ---- -------
-------- ----------
-------- ----------

------------------ ---------- -- --- -- -
    -- -- -- -- -
        ------ ------------- -- ----
    -
    ------ - - -- -- ------
-

--- ------ -
    ---- ------ - ---------- ---
    -- -------------------- -
        --------- -- -------- - -- -------------- -- ----------
    - ---- -
        --------- -- --------- -- ------ -- ----------
    -

    ------ - ---------- ---
    -- -------- -
        --------- -- -------- - -- ------- -- ----------
    - ---- -
        --------- -- --------- -- ------ -- ----------
    -

    ------ --
-

本题详细解读

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 可以用于任何类型的对象,包括自定义类型和标准库类型。
纠错
反馈