Namespaces
Variants

std::optional<T>::optional

ja.cppreference.net より
 
 
ユーティリティライブラリ
言語サポート
型サポート (基本型、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)
swap と 型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
共通の語彙型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
 
constexpr optional() noexcept;
constexpr optional( std::nullopt_t ) noexcept;
(1) (C++17以上)
constexpr optional( const optional& other );
(2) (C++17以上)
constexpr optional( optional&& other ) noexcept(/* see below */);
(3) (C++17以上)
template < class U >
optional( const optional<U>& other );
(4) (C++17以上)
(C++20からconstexpr)
(条件付きでexplicit)
template < class U >
optional( optional<U>&& other );
(5) (C++17以上)
(C++20からconstexpr)
(条件付きでexplicit)
template< class... Args >
constexpr explicit optional( std::in_place_t, Args&&... args );
(6) (C++17以上)
template< class U, class... Args >
constexpr explicit optional( std::in_place_t,
                             std::initializer_list<U> ilist,
                             Args&&... args );
(7) (C++17以上)
template < class U = std::remove_cv_t<T> >
constexpr optional( U&& value );
(8) (C++17以上)
(条件付きでexplicit)

新しいoptionalオブジェクトを構築します。

1) 値を保持しないオブジェクトを構築します。
2) コピーコンストラクタ: otherが値を保持している場合、保持する値を直接初期化(ただし直接リスト初期化ではない)によって型Tのオブジェクトを式*otherで初期化したかのように初期化します。otherが値を保持していない場合、値を保持しないオブジェクトを構築します。
  • このコンストラクタは、std::is_copy_constructible_v<T>がfalseである場合、削除されたものとして定義されます。
  • std::is_trivially_copy_constructible_v<T>がtrueである場合、トリビアルコンストラクタです。
3) ムーブコンストラクタ: otherが値を保持している場合、保持する値を直接初期化(ただし直接リスト初期化ではない)によって型Tのオブジェクトを式std::move(*other)で初期化したかのように初期化し、を空にしません: ムーブ元のotherは依然として値をstd::optional保持していますが、値自体はムーブされます。が値を保持していない場合、値をother保持しないオブジェクトを構築します。 このコンストラクタは、
  • がstd::is_move_constructible_v<T>である場合を除き、オーバーロード解決に参加しません。true
  • std::is_trivially_move_constructible_v<T>がtrueである場合、トリビアルコンストラクタです。
4) 変換コピーコンストラクタ: otherが値を保持していない場合、値を保持しないoptionalオブジェクトを構築します。そうでなければ、値を保持するoptionalオブジェクトを構築し、直接初期化(ただし直接リスト初期化ではない)によって型Tのオブジェクトを式*otherで初期化したかのように初期化します。
  • このコンストラクタは、以下の条件が満たされる場合を除き、オーバーロード解決に参加しません:
    • std::is_constructible_v<T, const U&>はtrueです。
    • Tが(cv修飾された可能性のある)boolでない場合、Tは(可能性のあるconst)std::optional<U>型の任意の式から構築可能または変換可能ではありません。すなわち、converts_from_any_cvref<T, std::optional<U>>はfalseです。ここでconverts_from_any_cvrefは後述されます。
  • このコンストラクタは、explicitがstd::is_convertible_v<const U&, T>である場合に限りfalseです。
5) 変換ムーブコンストラクタ: otherが値を保持していない場合、値を保持しないoptionalオブジェクトを構築します。そうでなければ、値を保持するoptionalオブジェクトを構築し、直接初期化(ただし直接リスト初期化ではない)によって型Tのオブジェクトを式std::move(*other)で初期化したかのように初期化します。
  • このコンストラクタは、以下の条件が満たされる場合を除き、オーバーロード解決に参加しません:
    • std::is_constructible_v<T, U&&>はtrueです。
    • Tが(cv修飾された可能性のある)boolでない場合、Tは(可能性のあるconst)std::optional<U>型の任意の式から構築可能または変換可能ではありません。すなわち、converts_from_any_cvref<T, std::optional<U>>はfalseです。ここでconverts_from_any_cvrefは後述されます。
  • このコンストラクタは、explicitがstd::is_convertible_v<U&&, T>である場合に限りfalseです。
6) 値を保持するoptionalオブジェクトを構築し、直接初期化(ただし直接リスト初期化ではない)によって型Tのオブジェクトを引数std::forward<Args>(args)...から初期化したかのように初期化します。
  • Tの選択されたコンストラクタがconstexprコンストラクタである場合、このコンストラクタはconstexprコンストラクタです。
  • この関数は、std::is_constructible_v<T, Args...>がtrueである場合を除き、オーバーロード解決に参加しません。
7) 値を保持するoptionalオブジェクトを構築し、直接初期化(ただし直接リスト初期化ではない)によって型Tのオブジェクトを引数ilist, std::forward<Args>(args)...から初期化したかのように初期化します。
  • Tの選択されたコンストラクタがconstexprコンストラクタである場合、このコンストラクタはconstexprコンストラクタです。
  • この関数は、std::is_constructible_v<T, std::initializer_list<U>&, Args...>がtrueである場合を除き、オーバーロード解決に参加しません。
8) 値を保持するoptionalオブジェクトを構築し、直接初期化(ただし直接リスト初期化ではない)によって型Tのオブジェクトを式std::forward<U>(value)で初期化したかのように初期化します。
  • Tの選択されたコンストラクタがconstexprコンストラクタである場合、このコンストラクタはconstexprコンストラクタです。
  • このコンストラクタは、以下の条件が満たされる場合を除き、オーバーロード解決に参加しません:
    • std::is_constructible_v<T, U&&>はtrueです。
    • std::decay_t<U>(C++20まで)std::remove_cvref_t<U>(C++20以上)はstd::in_place_tでもstd::optional<T>でもありません。
    • Tが(cv修飾された可能性のある)boolである場合、std::decay_t<U>(C++20まで)std::remove_cvref_t<U>(C++20以上)はstd::optionalの特殊化ではありません。
  • このコンストラクタは、explicitがstd::is_convertible_v<U&&, T>である場合に限りfalseです。

ヘルパー変数テンプレートconverts_from_any_cvrefは以下と同等です:

template< class T, class W >
constexpr bool converts_from_any_cvref =
    std::disjunction_v<std::is_constructible<T, W&>, std::is_convertible<W&, T>,
                       std::is_constructible<T, W>, std::is_convertible<W, T>,
                       std::is_constructible<T, const W&>, std::is_convertible<const W&, T>,
                       std::is_constructible<T, const W>, std::is_convertible<const W, T>>;

パラメータ

other - 別の optional オブジェクト。その含まれる値がコピーされます
value - 含まれる値を初期化するための値
args... - 含まれる値を初期化するための引数
ilist - 含まれる値を初期化するための初期化子リスト

例外

3) Tのコンストラクタによってスローされるあらゆる例外をスローします。
4) Tのコンストラクタが送出するあらゆる例外を送出する。以下の
noexcept 指定を持つ:
noexcept ( std:: is_nothrow_move_constructible < T > :: value )
5-9) Tのコンストラクタによってスローされるあらゆる例外をスローします。

注記

LWG issue 3836 が解決される以前は、 std:: optional < bool > を std:: optional < U > から構築する際、 U が bool でない場合、オーバーロード ( 5,6 ) ではなくオーバーロード ( 9 ) が選択されていました。これは、オーバーロード ( 5,6 ) が T (この場合は bool )が std:: optional < U > から構築または変換可能な場合にオーバーロード解決に参加しなかったためです。しかし、 std::optional::operator bool によってあらゆる U に対して変換が可能となっていました。

結果として、構築された std:: optional < bool > は常に値を保持します。その値は、提供された std:: optional < U > オブジェクトが値を保持しているかどうかによって決定され、保持されている値から直接初期化された bool 値そのものではありません:

std::optional<bool> op_false(false);
std::optional<int> op_zero(0);
std::optional<int> from_bool(op_false); // OK: 0を含む (falseから初期化)
std::optional<bool> from_int(op_zero);  // 欠陥 (LWG 3836): trueを含む - 
                                        // op_zeroが値を含んでいるため、
                                        // その値からboolを初期化するとfalseになる場合でも
機能テスト マクロ 値 標準 機能
__cpp_lib_optional 202106L (C++20)
(DR20)
完全な constexpr ( 5,6 )

例

#include <iostream>
#include <optional>
#include <string>
int main()
{
    std::optional<int> o1, // 空
                       o2 = 1, // 右辺値からの初期化
                       o3 = o2; // コピーコンストラクタ
    // std::string( initializer_list<CharT> ) コンストラクタを呼び出し
    std::optional<std::string> o4(std::in_place, {'a', 'b', 'c'});
    // std::string( size_type count, CharT ch ) コンストラクタを呼び出し
    std::optional<std::string> o5(std::in_place, 3, 'A');
    // 型推導ガイドを使用してstd::stringからムーブ構築
    std::optional o6(std::string{"deduction"});
    std::cout << *o2 << ' ' << *o3 << ' ' << *o4 << ' ' << *o5  << ' ' << *o6 << '\n';
}

出力:

1 1 abc AAA deduction

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 3836 C++17 std:: optional < bool > を std:: optional < U > から構築する際、
オーバーロード解決が ( 9 ) を選択する( U が bool でない場合)
この場合、常に変換コピー/ムーブ
コンストラクタを選択する
LWG 3886 C++17 オーバーロード ( 9 ) のデフォルトテンプレート引数が T だった std:: remove_cv_t < T > に変更
P0602R4 C++17 コピー/ムーブコンストラクタが、基になるコンストラクタが
自明であっても自明でない可能性があった
自明性の伝播が
要求されるようになった
P2231R1 C++20 他の std::optional からのオーバーロード ( 5,6 ) が constexpr ではなかった constexpr 化された

関連項目

optionalオブジェクトを作成する
(関数テンプレート)