std::optional<T>::optional
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オブジェクトを構築します。
otherが値を保持している場合、保持する値を直接初期化(ただし直接リスト初期化ではない)によって型Tのオブジェクトを式*otherで初期化したかのように初期化します。otherが値を保持していない場合、値を保持しないオブジェクトを構築します。
- このコンストラクタは、
std::is_copy_constructible_v<T>がfalseである場合、削除されたものとして定義されます。 std::is_trivially_copy_constructible_v<T>がtrueである場合、トリビアルコンストラクタです。
otherが値を保持している場合、保持する値を直接初期化(ただし直接リスト初期化ではない)によって型Tのオブジェクトを式std::move(*other)で初期化したかのように初期化し、を空にしません: ムーブ元のotherは依然として値をstd::optional保持していますが、値自体はムーブされます。が値を保持していない場合、値をother保持しないオブジェクトを構築します。
このコンストラクタは、- が
std::is_move_constructible_v<T>である場合を除き、オーバーロード解決に参加しません。true std::is_trivially_move_constructible_v<T>がtrueである場合、トリビアルコンストラクタです。
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です。
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です。
Tのオブジェクトを引数std::forward<Args>(args)...から初期化したかのように初期化します。
Tの選択されたコンストラクタがconstexprコンストラクタである場合、このコンストラクタはconstexprコンストラクタです。- この関数は、
std::is_constructible_v<T, Args...>がtrueである場合を除き、オーバーロード解決に参加しません。
Tのオブジェクトを引数ilist, std::forward<Args>(args)...から初期化したかのように初期化します。
Tの選択されたコンストラクタがconstexprコンストラクタである場合、このコンストラクタはconstexprコンストラクタです。- この関数は、
std::is_constructible_v<T, std::initializer_list<U>&, Args...>がtrueである場合を除き、オーバーロード解決に参加しません。
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 | - | 含まれる値を初期化するための初期化子リスト |
例外
Tのコンストラクタによってスローされるあらゆる例外をスローします。
Tのコンストラクタが送出するあらゆる例外を送出する。以下の
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 化された |
関連項目
|
(C++17)
|
optionalオブジェクトを作成する
(関数テンプレート) |