0Pricing
C++ Academy · レッスン

optionalによる値の不在の表現

ヌルポインタを避けます

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

nullの問題

「値がない」ことを示すために-1のようなセンチネル値やnullポインターを返す方法は、壊れやすく、誤用も起こりやすいものです。std::optional<T>は、「値がある、または何もない」ことを明示的に表します。<optional>をインクルードしてください。

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

空のOptional

optionalをデフォルト構築するか、std::nulloptを代入すると、値を保持しない空のoptionalになります。

#include <iostream>
#include <optional>
int main() {
    std::optional<int> empty;
    std::optional<int> also = std::nullopt;
    std::cout << empty.has_value() << " " << also.has_value() << "\n";
}

値の有無を確認する

has_value()を呼び出すか、optionalをブールコンテキストで直接使用して、値を保持しているかどうかを確認できます。

#include <iostream>
#include <optional>
int main() {
    std::optional<int> o = 5;
    if (o) std::cout << "has value\n";
    if (o.has_value()) std::cout << "yes\n";
}

戻り値の型としてのOptional

結果を生成できない可能性がある関数に、optionalは最適です。成功時には値を返し、失敗時にはstd::nulloptを返します。

#include <iostream>
#include <optional>
std::optional<int> half(int n) {
    if (n % 2 == 0) return n / 2;
    return std::nullopt;
}
int main() {
    auto r = half(10);
    if (r) std::cout << *r << "\n";
}

値を読み取る

値を保持していることがわかっている場合は、*optまたはopt.value()を使用します。空のoptionalを*でデリファレンスすると、未定義の動作になります。

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

自己説明的なシグネチャ

std::optionalを戻り値の型にすると、その関数が結果を返さない可能性があることを、コメントなしでも呼び出し側にひと目で伝えられます。

#include <iostream>
#include <optional>
#include <string>
std::optional<std::string> getEnvName(bool present) {
    if (present) return std::string("CONFIG");
    return std::nullopt;
}
int main() { std::cout << getEnvName(true).has_value() << "\n"; }

Optionalをリセットする

reset()を呼び出すか、std::nulloptを代入すると、optionalを再び空にできます。

#include <iostream>
#include <optional>
int main() {
    std::optional<int> o = 99;
    o.reset();
    std::cout << o.has_value() << "\n"; // 0
}

その場で構築する

emplaceは、保持する値をoptionalの内部に直接構築し、余分なコピーを避けます。

#include <iostream>
#include <optional>
#include <string>
int main() {
    std::optional<std::string> o;
    o.emplace("built in place");
    std::cout << *o << "\n";
}

Optionalとポインター

生のポインターはnullにできますが、所有権について何も示さず、ダングリングの危険もあります。optionalは値を所有し、ヒープ割り当てなしで「存在しない可能性がある」ことを明確に示します。

参照のOptional?

std::optionalが格納するのは値であり、参照ではありません。既存のオブジェクトを任意に参照したい場合は、ポインターを格納するか、std::optional<std::reference_wrapper<T>>を使用してください。

Optionalを使う場面

結果が見つからない可能性のある検索、失敗する可能性のある解析、未設定の可能性がある設定値などに使用してください。次のレッスンでは、保持された値に安全にアクセスする方法を学びます。

理解度チェック

std::optionalについての理解を確認しましょう。

まとめ

std::optionalの基本について、次のことを学びました:

  • センチネル値やnullを使わずに、「値がある、または何もない」ことを表します。
  • デフォルト構築またはstd::nulloptによって空になります。
  • has_value()またはブール値としての判定で確認します。
  • 失敗する可能性がある検索の戻り値の型として最適です。

よくある質問

「optionalによる値の不在の表現」レッスンは無料ですか?

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

「optionalによる値の不在の表現」で何を学びますか?

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

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

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

「optionalによる値の不在の表現」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

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