0Pricing
C++ Academy · レッスン

optional値へのアクセス

value_orとhas_valueを使用します

「optional値へのアクセス」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。

デリファレンス演算子

optionalを読み取る最も速い方法は*optですが、値を保持していると確信できる場合に限ります。チェックは行われません。

#include <iostream>
#include <optional>
int main() {
    std::optional<int> o = 10;
    if (o) std::cout << *o << "\n";
}

value()メソッド

opt.value()は値を返しますが、optionalが空の場合はstd::bad_optional_accessを送出します。空のoptionalを実際のエラーとして扱う場合に使用してください。

#include <iostream>
#include <optional>
int main() {
    std::optional<int> o;
    try { std::cout << o.value() << "\n"; }
    catch (const std::bad_optional_access&) { std::cout << "empty!\n"; }
}

デフォルト値のvalue_or

opt.value_or(fallback)は、値があれば保持された値を返し、なければfallbackを返します。分岐も例外も必要ありません。

#include <iostream>
#include <optional>
int main() {
    std::optional<int> o = std::nullopt;
    std::cout << o.value_or(-1) << "\n"; // -1
}

実際のデータでvalue_orを使う

よくある用途は、存在しない設定値や検索結果にデフォルト値を指定することです。

#include <iostream>
#include <optional>
#include <string>
std::optional<std::string> lookup(bool found) {
    if (found) return std::string("Pro");
    return std::nullopt;
}
int main() {
    std::cout << lookup(false).value_or("Free") << "\n";
}

アロー演算子

クラス型のoptionalでは、opt->memberを使ってメンバーに直接アクセスできます(この場合も空でないことが前提です)。

#include <iostream>
#include <optional>
#include <string>
int main() {
    std::optional<std::string> o = std::string("hello");
    if (o) std::cout << o->size() << "\n";
}

アクセス前にガードする

安全なイディオムは、確認してから使用することです。確認とアクセスを組み合わせることで、例外と未定義の動作の両方を避けられます。

#include <iostream>
#include <optional>
int main() {
    std::optional<int> o = 7;
    if (o.has_value()) {
        int x = *o;
        std::cout << x * 2 << "\n";
    }
}

if文の初期化ステートメント

if文の初期化ステートメントを使うと、1行で宣言と確認を行えます。optionalのスコープも分岐内に限定できます。

#include <iostream>
#include <optional>
std::optional<int> find() { return 3; }
int main() {
    if (auto v = find(); v.has_value())
        std::cout << *v << "\n";
}

Transform(C++23)

transformのようなモナディックヘルパーは、値が存在する場合にだけ関数を適用し、新しいoptionalを返します。これにより、計算をすっきり連結できます。

and_thenによる連結

and_then(C++23)は、それ自体がoptionalを返す関数を呼び出し、結果を平坦化します。各ステップが失敗する可能性がある処理に適しています。

アクセサーを選ぶ

妥当なデフォルト値がある場合はvalue_orを、空であることを例外として扱うべき場合はvalue()を、明示的なチェックの後だけ*または->を使用してください。

チェックなしのデリファレンスを避ける

optionalが空でないことを確認せずに、*optを決して呼び出さないでください。これは未定義の動作であり、クラッシュのよくある原因です。

理解度チェック

optionalへのアクセスについての理解を確認しましょう。

まとめ

optionalへのアクセス方法として、次のことを学びました:

  • チェック後に*と->を使用します。
  • value()は空の場合に例外を送出します。
  • value_orはデフォルト値を指定します。
  • モナディックなtransformとand_thenで操作を連結できます(C++23)。

よくある質問

「optional値へのアクセス」レッスンは無料ですか?

はい。「optional値へのアクセス」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。

「optional値へのアクセス」で何を学びますか?

value_orとhas_valueを使用します ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C++ Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「optional値へのアクセス」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC++ Academyレッスンでコードを書いて実行できますか?

はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. optionalによる値の不在の表現
  2. optional値へのアクセス
  3. std::expectedの基礎
  4. エラー処理パターン
← C++ Academyに戻る