std::optional: null安全の第一歩

「値がないかもしれない」を型で表現。-1やnullptrを卒業。

optional
値があるかもしれないしないかも。
nullopt
「値がない」を表すリテラル。
value_or
デフォルト値を指定して取得。

optionalとは?

プレゼント箱

中身が入っているかもしれないし、空かもしれない箱。開ける前にチェック可能。

Basic Usage
#include <optional>
std::optional<int> find_index(const std::vector<int>& v, int target) {
for (size_t i = 0; i < v.size(); ++i) {
if (v[i] == target) return i;
}
return std::nullopt; // 見つからなかった
}
auto result = find_index(vec, 42);
if (result) {
std::cout << "Found at: " << *result << '
';
}
実行結果
find_index({1,2,3}, 2) → 1
find_index({1,2,3}, 99) → nullopt
Bad
// ❌ Bad: マジックナンバーで「見つからない」を表現
int find_index(...) {
// ...
return -1; // 見つからない
}
// -1 が有効な値だったら?
Good
// ✅ Good: optional で意図を明確に
std::optional<int> find_index(...) {
// ...
return std::nullopt; // 明確
}

アクセス方法

Accessing Values
std::optional<std::string> name = "Alice";
// 値があるかチェック
if (name.has_value()) { /* ... */ }
if (name) { /* ... */ } // 短縮形
// 値にアクセス
*name; // 直接(チェックなし)
name.value(); // チェック付き(例外投げる)
name.value_or("Unknown"); // デフォルト値
Tip: value_or() はデフォルト値を毎回評価するので、重い処理は避ける。

合格ライン

optional を返す関数を書ける
value_or と value の違いを知っている

参考リンク

演習課題

課題1: optional を返す関数
検索結果が見つからない場合に std::nullopt を返す関数を作成してください。
課題2: value_or
value_or を使ってデフォルト値を提供してください。

次のステップ