名前空間
変種
操作

std::optional

From cppreference.com
< cpp‎ | utility
 
 
ユーティリティライブラリ
言語サポート
型のサポート (基本型、RTTI)
ライブラリ機能検査マクロ (C++20)
プログラムユーティリティ
可変引数関数
コルーチンサポート (C++20)
契約サポート (C++26)
三方比較
(C++20)
(C++20)(C++20)(C++20)  
(C++20)(C++20)(C++20)

汎用ユーティリティ
関係演算子 (C++20で非推奨)
整数比較関数
(C++20)(C++20)(C++20)  
(C++20)
スワップ型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
共通語彙型
(C++11)
optional
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
 
ヘッダ <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() が呼び出された場合。

optional オブジェクトは、値を保持している場合は1つの要素を、そうでなければ0個の要素を持つviewです。保持されている要素の寿命はオブジェクトに束縛されます。

(C++26以降)

optional な参照、関数、配列、または(cv修飾された可能性のある)void は存在しません。プログラムがそのような型で optional をインスタンス化した場合、不適格 (ill-formed) となります。さらに、プログラムが(cv修飾された可能性のある)タグ型 std::nullopt_t または std::in_place_toptional をインスタンス化した場合も、不適格となります。

目次

[編集] テンプレートパラメータ

T - 初期化状態を管理する値の型。この型は Destructible の要件を満たさなければなりません(特に、配列型と参照型は許可されません)。

[編集] ネストされた型

定義
value_type T
iterator (C++26から) 実装定義の LegacyRandomAccessIteratorConstexprIterator、および contiguous_iterator であり、その value_typereference はそれぞれ std::remove_cv_t<T>T& です。
const_iterator (C++26から) 実装定義の LegacyRandomAccessIteratorConstexprIterator、および contiguous_iterator であり、その value_typereference はそれぞれ std::remove_cv_t<T>const T& です。

Container のイテレータ型に対するすべての要件は、optionaliterator 型にも同様に適用されます。

[編集] データメンバ

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) [編集]
optional オブジェクトを作成する
(function template) [編集]
std::swap アルゴリズムを特殊化する
(function template) [編集]

[編集] ヘルパークラス

std::optional のハッシュサポート
(class template specialization) [編集]
(C++17)
std::optional が値を保持していないことを示すインジケータ
(class) [編集]
値を保持していない 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 の特殊化により、optionalview を満たします。

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
(クラステンプレート) (変数テンプレート)[編集]
English 日本語 中文(简体) 中文(繁體)