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への文脈的変換
bool
が行われる場合、オブジェクトが値を保持しているときは
true
を返し、値を保持していないときは
false
を返します。
optional
オブジェクトは以下の条件で値を保持します:
-
オブジェクトは、型
Tの値、または値を含む別のoptionalで初期化/代入されます。
オブジェクトは以下の条件下で値を保持していません:
- オブジェクトはデフォルト初期化されます。
-
オブジェクトが
std::nullopt_t
型の値、または値を含まない
optionalオブジェクトで初期化/代入されます。 - メンバー関数 reset() が呼び出されます。
|
|
(C++26以降) |
オプショナルな参照、関数、配列、または(CV修飾された可能性のある)
void
は存在しません。そのような型で
optional
をインスタンス化するプログラムは不適格です。さらに、
optional
を(CV修飾された可能性のある)タグ型
std::nullopt_t
または
std::in_place_t
でインスタンス化するプログラムも不適格です。
目次 |
テンプレートパラメータ
| 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
オブジェクトを比較する
(関数テンプレート) |
|
(C++17)
|
optional
オブジェクトを作成する
(関数テンプレート) |
|
(C++17)
|
std::swap
アルゴリズムを特殊化する
(関数テンプレート) |
ヘルパークラス
|
(C++17)
|
std::optional
のハッシュサポート
(クラステンプレートの特殊化) |
|
(C++17)
|
std::optional
が値を含まないことを示すインジケータ
(クラス) |
|
(C++17)
|
値を含まないオプショナルへのチェック付きアクセスを示す例外
(クラス) |
ヘルパー
|
(C++17)
|
nullopt_t
型のオブジェクト
(定数) |
|
インプレース構築タグ
(タグ) |
ヘルパー特殊化
|
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
(クラステンプレート) (カスタマイゼーションポイントオブジェクト) |
|
|
(C++20)
|
要素を持たない空の
view
(クラステンプレート) (変数テンプレート) |