Namespaces
Variants

std::optional<T>:: optional

From cppreference.net
Utilities library
constexpr optional ( ) noexcept ;
(1) (C++17以降)
constexpr optional ( std:: nullopt_t ) noexcept ;
(2) (C++17以降)
constexpr optional ( const optional & other ) ;
(3) (C++17以降)
constexpr optional ( optional && other ) noexcept ( /* 下記参照 */ ) ;
(4) (C++17以降)
template < class U >
optional ( const optional < U > & other ) ;
(5) (C++17以降)
(C++20以降 constexpr)
(条件付き explicit)
template < class U >
optional ( optional < U > && other ) ;
(6) (C++17以降)
(C++20以降 constexpr)
(条件付き explicit)
template < class ... Args >
constexpr explicit optional ( std:: in_place_t , Args && ... args ) ;
(7) (C++17以降)
template < class U, class ... Args >

constexpr explicit optional ( std:: in_place_t ,
std:: initializer_list < U > ilist,

Args && ... args ) ;
(8) (C++17以降)
template < class U = std:: remove_cv_t < T > >
constexpr optional ( U && value ) ;
(9) (C++17以降)
(条件付き explicit)

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

目次

翻訳の説明: - 「Contents」のみを「目次」に翻訳しました - HTMLタグ、属性、リンク先は一切変更していません - C++専門用語(Parameters, Effects, Exceptions, Deduction guidesなど)は原文のまま保持しています - 番号や書式設定は完全に維持しています

パラメータ

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

効果

オーバーロード 初期化方法 含まれる値の初期化子 has_value() 構築後の状態
( 1 ) N/A - false
( 2 )
( 3 ) 直接初期化 (非リスト) * other other. has_value ( )
  • false の場合、含まれる値は初期化されない
( 4 ) std :: move ( * other )
( 5 ) * other
( 6 ) std :: move ( * other )
( 7 ) std:: forward < Args > ( args ) ... true
( 8 ) ilist, std:: forward < Args > ( args ) ...
( 9 ) std:: forward < U > ( value )

制約条件と補足情報

3) std:: is_copy_constructible_v < T > false の場合、コンストラクタは削除定義される。
std:: is_trivially_copy_constructible_v < T > true の場合、コンストラクタはtrivialです。
4) このオーバーロードは、 std:: is_move_constructible_v < T > true の場合にのみ、オーバーロード解決に参加します。
std:: is_trivially_move_constructible_v < T > true の場合、このコンストラクタはトリビアルです。
5) このオーバーロードは、以下の全ての条件が満たされる場合にのみオーバーロード解決に参加します:
このオーバーロードは以下のように宣言されているかのように動作します explicit ( ! std:: is_convertible_v < const U & , T > ) .
6) このオーバーロードは、以下の全ての条件が満たされる場合にのみオーバーロード解決に参加します:
このオーバーロードは、以下のように宣言されているかのように動作します explicit ( ! std:: is_convertible_v < U, T > )
7) このオーバーロードは、 std:: is_constructible_v < T, Args... > true の場合にのみ、オーバーロード解決に参加します。
初期化のために選択された T のコンストラクタが constexpr コンストラクタである場合、このコンストラクタもまた constexpr コンストラクタとなります。
8) このオーバーロードは、 std:: is_constructible_v < T, std:: initializer_list < U > & , Args... > true である場合にのみ、オーバーロード解決に参加します。
初期化のために選択された T のコンストラクタが constexpr コンストラクタである場合、このコンストラクタもまた constexpr コンストラクタとなります。
9) このオーバーロードは、以下の全ての条件が満たされる場合にのみオーバーロード解決に参加します:
このオーバーロードは、以下のように宣言されているかのように動作します explicit ( ! std:: is_convertible_v < U, T > ) .
初期化のために選択された T のコンストラクタが constexpr コンストラクタである場合、このコンストラクタもまた constexpr コンストラクタとなります。
  1. 1.0 1.1 言い換えれば、 T は(const修飾された可能性のある)型 std:: optional < U > の任意の式から構築可能でも変換可能でもない。

例外

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 オブジェクトを作成する
(関数テンプレート)