std::optionalの挙動について

https://cpprefjp.github.io/reference/optional/optional.html

上記の例がわかりやすい。

#include <iostream>
#include <optional>

// 除算をする関数。
// ゼロ割りを試みた場合、無効値が返る
std::optional<int> safe_divide(int a, int b)
{
  if (b == 0)
    return std::nullopt;

  return a / b;
}

int main()
{
  // 9/3を計算する
  std::optional<int> result1 = safe_divide(9, 3);
  if (result1) { // 計算に成功した場合、有効値が返る
    int x = result1.value(); // 有効値を取り出す
    std::cout << x << std::endl;
  }

  // 3/0の計算を試みる
  std::optional<int> result2 = safe_divide(3, 0);
  if (!result2) { // 計算に失敗した場合、無効値が返る
    std::cout << "error" << std::endl;
  }
}
出力
3
error

std::optionalは、無効値が発生しうる関数の戻り値として、無効値が発生したらstd::nulloptを返して、呼び出し側で制御するために使う。
ただし、

std::optional<int&> safe_divide(int a, int b)

のように、optionalに参照を設定するとビルドエラーになる。
なので、参照を戻り値として受け取って、呼び出し側で変更する形の関数には適用できない。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です