std::optional
| ヘッダ <optional> で定義 |
||
| template< class T > class optional; |
(C++17以降) | |
クラステンプレート std::optional は、オプショナルな(有効な値を保持しているかもしれないし、していないかもしれない)値を管理します。
optional の一般的なユースケースは、失敗する可能性のある関数の戻り値です。std::pair<T, bool> のような他のアプローチとは対照的に、optional は構築コストの高いオブジェクトをうまく扱い、意図が明示的に表現されるため、より読みやすくなります。
optional の任意のインスタンスは、任意の時点で「値を保持している」か「値を保持していない」かのどちらかです。
optional が値を保持している場合、その値は optional オブジェクトの中にネストされることが保証されます。したがって、optional オブジェクトは、operator*() と operator->() が定義されていても、ポインタではなくオブジェクトをモデル化します。
optional<T> 型のオブジェクトが文脈的に bool に変換される場合、オブジェクトが値を保持していれば true を返し、値を保持していなければ false を返します。
optional オブジェクトは、以下の条件で値を保持します。
T型の値、または値を保持している別のoptionalで初期化または代入された場合。
オブジェクトは、以下の条件で値を保持しません。
- オブジェクトがデフォルト初期化された場合。
- オブジェクトが std::nullopt_t 型の値、または値を保持していない
optionalオブジェクトで初期化または代入された場合。 - メンバ関数 reset() が呼び出された場合。
|
|
(C++26以降) |
optional な参照、関数、配列、または(cv修飾された可能性のある)void は存在しません。プログラムがそのような型で optional をインスタンス化した場合、不適格 (ill-formed) となります。さらに、プログラムが(cv修飾された可能性のある)タグ型 std::nullopt_t または std::in_place_t で optional をインスタンス化した場合も、不適格となります。
目次 |
[編集] テンプレートパラメータ
| T | - | 初期化状態を管理する値の型。この型は Destructible の要件を満たさなければなりません(特に、配列型と参照型は許可されません)。 |
[編集] ネストされた型
| 型 | 定義 |
value_type
|
T
|
iterator (C++26から) |
実装定義の LegacyRandomAccessIterator、ConstexprIterator、および contiguous_iterator であり、その value_type と reference はそれぞれ std::remove_cv_t<T> と T& です。 |
const_iterator (C++26から) |
実装定義の LegacyRandomAccessIterator、ConstexprIterator、および contiguous_iterator であり、その value_type と reference はそれぞれ std::remove_cv_t<T> と const T& です。 |
Container のイテレータ型に対するすべての要件は、optional の iterator 型にも同様に適用されます。
[編集] データメンバ
T* val |
保持されているオブジェクトへのポインタ(存在する場合) (説明用のメンバオブジェクト*) |
[編集] メンバ関数
optional オブジェクトを構築する(public member function) | |
| 保持されている値があれば、それを破棄する (public member function) | |
| 内容を代入する (public member function) | |
イテレータ | |
| (C++26) |
先頭へのイテレータを返す (public member function) |
| (C++26) |
末尾へのイテレータを返す (public member function) |
監視 | |
| 保持されている値にアクセスする (public member function) | |
| オブジェクトが値を保持しているか確認する (public member function) | |
| 保持されている値を返す (public member function) | |
| 保持されている値が利用可能であればそれを返し、そうでなければ別の値を返す (public member function) | |
モナド操作 | |
| (C++23) |
保持されている値が存在する場合、その値に対して与えられた関数の結果を返し、そうでなければ空の optional を返す(public member function) |
| (C++23) |
保持されている値が存在する場合、変換された値を保持する optional を返し、そうでなければ空の optional を返す(public member function) |
| (C++23) |
値を保持している場合は optional 自身を返し、そうでなければ与えられた関数の結果を返す(public member function) |
変更 | |
| 内容を交換する (public member function) | |
| 保持されている値を破棄する (public member function) | |
| 保持する値を直接構築する (public member function) | |
[編集] 非メンバ関数
| (C++17)(C++17)(C++17)(C++17)(C++17)(C++17)(C++20) |
optional オブジェクトを比較する(function template) |
| (C++17) |
optional オブジェクトを作成する(function template) |
| (C++17) |
std::swap アルゴリズムを特殊化する (function template) |
[編集] ヘルパークラス
| (C++17) |
std::optional のハッシュサポート (class template specialization) |
| (C++17) |
std::optional が値を保持していないことを示すインジケータ(class) |
| (C++17) |
値を保持していない optional へのチェック付きアクセスを示す例外 (class) |
[編集] ヘルパー
| (C++17) |
nullopt_t 型のオブジェクト(constant) |
| インプレース構築タグ (tag) |
[編集] ヘルパー特殊化
| template< class T > constexpr bool ranges::enable_view<std::optional<T>> = true; |
(C++26以降) | |
この ranges::enable_view の特殊化により、optional は view を満たします。
| template< class T > constexpr auto format_kind<std::optional<T>> = range_format::disabled; |
(C++26以降) | |
この format_kind の特殊化は、optional の範囲フォーマットサポートを無効にします。
[編集] 推論ガイド
[編集] ノート
| 機能テストマクロ | 値 | 規格 | 機能 |
|---|---|---|---|
__cpp_lib_optional |
201606L |
(C++17) | std::optional
|
202106L |
(C++23) (DR20) |
完全な constexpr | |
202110L |
(C++23) | モナド操作 | |
__cpp_lib_optional_range_support |
202406L |
(C++26) | std::optional の範囲サポート |
[編集] 例
#include <iostream> #include <optional> #include <string> // optional can be used as the return type of a factory that may fail std::optional<std::string> create(bool b) { if (b) return "Godzilla"; return {}; } // std::nullopt can be used to create any (empty) std::optional auto create2(bool b) { return b ? std::optional<std::string>{"Godzilla"} : std::nullopt; } int main() { std::cout << "create(false) returned " << create(false).value_or("empty") << '\n'; // optional-returning factory functions are usable as conditions of while and if if (auto str = create2(true)) std::cout << "create2(true) returned " << *str << '\n'; }
出力
create(false) returned empty create2(true) returned Godzilla
[編集] 欠陥報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 4141 | C++17 | ストレージの要件が 紛らわしかった |
保持されるオブジェクトはoptional オブジェクト内にネストされなければならない |
[編集] 関連項目
| (C++17) |
型安全な判別共用体 (クラステンプレート) |
| (C++17) |
任意の CopyConstructible な型のインスタンスを保持するオブジェクト (クラス) |
| (C++23) |
期待される値またはエラー値のいずれかを含むラッパー (クラステンプレート) |
指定された値の単一要素を含む view(クラステンプレート) (カスタマイゼーションポイントオブジェクト) | |
要素を持たない空の view(クラステンプレート) (変数テンプレート) |