std::optional: null安全の第一歩
「値がないかもしれない」を型で表現。-1やnullptrを卒業。
optional
値があるかもしれないしないかも。
nullopt
「値がない」を表すリテラル。
value_or
デフォルト値を指定して取得。
optionalとは?
#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; // 明確}アクセス方法
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 を使ってデフォルト値を提供してください。