std::expectedの基礎
値またはエラーを返します
「std::expectedの基礎」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
値またはエラー
std::expected<T, E>(C++23)は、型Tの成功した値、または型Eのエラーのいずれかを保持します。optionalとは異なり、失敗した理由も保持できます。<expected>をインクルードしてください。
成功を返す
成功時には値を直接返します。その値は「expected」型であるTとして格納されます。
#include <expected>
#include <iostream>
std::expected<int, std::string> parse(bool ok) {
if (ok) return 100;
return std::unexpected("bad input");
}
int main() {
auto r = parse(true);
if (r) std::cout << *r << "\n";
}エラーを返す
エラーをstd::unexpected(...)でラップすると、同じ型を返したまま失敗を通知できます。
#include <expected>
#include <iostream>
#include <string>
std::expected<int, std::string> div(int a, int b) {
if (b == 0) return std::unexpected("divide by zero");
return a / b;
}
int main() {
auto r = div(8, 0);
if (!r) std::cout << r.error() << "\n";
}成功を確認する
ブールコンテキストで結果を判定するか、has_value()を使用します。trueは値を保持していることを、falseはエラーを保持していることを意味します。
#include <expected>
#include <iostream>
int main() {
std::expected<int, int> r = 5;
std::cout << r.has_value() << "\n"; // 1
}値を読み取る
成功した値を読み取るには、*rまたはr.value()を使用します。実際にエラーを保持している場合、value()はstd::bad_expected_accessを送出します。
#include <expected>
#include <iostream>
int main() {
std::expected<int, std::string> r = 7;
if (r) std::cout << r.value() << "\n";
}エラーを読み取る
結果がエラー状態の場合、r.error()でエラーオブジェクトを取得できます。
#include <expected>
#include <iostream>
#include <string>
std::expected<int, std::string> f() { return std::unexpected("nope"); }
int main() {
auto r = f();
if (!r) std::cout << "error: " << r.error() << "\n";
}フォールバックとしてのvalue_or
optionalと同様に、value_or(fallback)はエラーを調べることなく、成功した値またはデフォルト値を返します。
#include <expected>
#include <iostream>
std::expected<int, std::string> f() { return std::unexpected("x"); }
int main() {
std::cout << f().value_or(0) << "\n"; // 0
}optionalとexpectedの違い
std::optionalは「値または何もない」ことを表し、std::expectedは「値または説明付きのエラー」を表します。呼び出し側が失敗の理由を知る必要がある場合は、expectedを選択してください。
豊富なエラー型
エラー型 E には、列挙型、構造体、メッセージ文字列などを使用できます。ドメイン内の失敗を最も適切に表せるものを選択してください。
#include <expected>
#include <iostream>
enum class Err { NotFound, Denied };
std::expected<int, Err> get(bool ok) {
if (ok) return 1;
return std::unexpected(Err::Denied);
}
int main() {
auto r = get(false);
if (!r) std::cout << (int)r.error() << "\n";
}例外は不要
std::expectedを使うと、失敗を通常の戻り値として伝播できます。例外を無効にしている場合や、例外のコストが高い場合に便利です。
利用可能性に関する注意
std::expectedはC++23の機能です。使用する前に、コンパイラーと標準規格フラグ(例: -std=c++23)が対応していることを確認してください。
理解度チェック
std::expectedについての理解度を確認しましょう。
まとめ
std::expectedについて学びました。
- 値(
T)またはエラー(E)のどちらかを保持します。 - 成功時は値を直接返し、エラー時は
std::unexpectedを介して返します。 *またはvalue()で値を読み取り、error()でエラーを読み取ります。- optionalとは異なり、失敗の理由を保持します。
よくある質問
「std::expectedの基礎」レッスンは無料ですか?
はい。「std::expectedの基礎」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「std::expectedの基礎」で何を学びますか?
値またはエラーを返します ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「std::expectedの基礎」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- optionalによる値の不在の表現
- optional値へのアクセス
- std::expectedの基礎
- エラー処理パターン