Namespaces
Variants

std:: optional

From cppreference.net
Utilities library
ヘッダーで定義 <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() が呼び出されます。

optional オブジェクトは、 view であり、値が含まれている場合は1つの要素を含み、値が含まれていない場合は0個の要素を含みます。含まれる要素の寿命はオブジェクトに束縛されます。

(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 オブジェクトを比較する
(関数テンプレート)
optional オブジェクトを作成する
(関数テンプレート)
std::swap アルゴリズムを特殊化する
(関数テンプレート)

ヘルパークラス

std::optional のハッシュサポート
(クラステンプレートの特殊化)
(C++17)
std::optional が値を含まないことを示すインジケータ
(クラス)
値を含まないオプショナルへのチェック付きアクセスを示す例外
(クラス)

ヘルパー

(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
(クラステンプレート) (カスタマイゼーションポイントオブジェクト)
要素を持たない空の view
(クラステンプレート) (変数テンプレート)