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に参照を設定するとビルドエラーになる。
なので、参照を戻り値として受け取って、呼び出し側で変更する形の関数には適用できない。
コメントを残す