std::optional<T>::optional
提供: cppreference.com
<tbody>
</tbody>
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以上) (条件付き explicit) |
template < class U > optional( optional<U>&& other ); |
(5) | (C++17以上) (条件付き 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 = value_type > constexpr optional( U&& value ); |
(8) | (C++17以上) (条件付き explicit) |
新しい optional オブジェクトを構築します。
1) 値を格納していないオブジェクトを構築します。
2) コピーコンストラクタ。
other が値を格納している場合は、式 *other を使用して T 型のオブジェクトを直接初期化 (しかし直接リスト初期化ではない) したかのように、格納される値を初期化します。 std::is_copy_constructible_v<T> が false の場合、このコンストラクタは削除されたものとして定義されます。 std::is_trivially_copy_constructible_v<T> が true の場合、これはトリビアルなコンストラクタになります。3) ムーブコンストラクタ。
other が値を格納している場合は、式 std::move(*other) を使用して T 型のオブジェクトを直接初期化 (しかし直接リスト初期化ではない) したかのように、格納される値を初期化します。 other は空になりません。 ムーブされた optional は引き続き値を格納している状態ですが、値自体はムーブされています。 other が値を格納していない場合は、値を格納していないオブジェクトを構築します。 このコンストラクタは、 std::is_move_constructible_v<T> が true でなければ、オーバーロード解決に参加しません。 std::is_trivially_move_constructible_v<T> が true の場合、これはトリビアルなコンストラクタになります。4) 変換コピーコンストラクタ。
other が値を格納していない場合は、値を格納していない optional を構築します。 そうでなければ、式 *other を使用して T 型のオブジェクトを直接初期化 (しかし直接リスト初期化ではない) したかのように初期化された、値を格納している optional オブジェクトを構築します。 このコンストラクタは、以下の条件が満たされなければ、オーバーロード解決に参加しません。
std::is_constructible_v<T, const U&>がtrueであるTがstd::optional<U>(またはそのconst修飾された) 型の任意の式から構築可能または変換可能でない、すなわち以下の8つの型特性がすべてfalseであるstd::is_constructible_v<T, std::optional<U>&>std::is_constructible_v<T, const std::optional<U>&>std::is_constructible_v<T, std::optional<U>&&>std::is_constructible_v<T, const std::optional<U>&&>std::is_convertible_v<std::optional<U>&, T>std::is_convertible_v<const std::optional<U>&, T>std::is_convertible_v<std::optional<U>&&, T>std::is_convertible_v<const std::optional<U>&&, T>
std::is_convertible_v<const U&, T> が false の場合、このコンストラクタは explicit になります。5) 変換ムーブコンストラクタ。
other が値を格納していない場合は、値を格納していない optional を構築します。 そうでなければ、式 std::move(*other) を使用して T 型のオブジェクトを直接初期化 (しかし直接リスト初期化ではない) したかのように初期化された、値を格納している optional オブジェクトを構築します。 このコンストラクタは、以下の条件が満たされなければ、オーバーロード解決に参加しません。
std::is_constructible_v<T, U&&>がtrueであるTがstd::optional<U>(またはその {{c|const} 修飾された) 型の任意の式から構築可能または変換可能でない、すなわち以下の8つの型特性がすべてfalseであるstd::is_constructible_v<T, std::optional<U>&>std::is_constructible_v<T, const std::optional<U>&>std::is_constructible_v<T, std::optional<U>&&>std::is_constructible_v<T, const std::optional<U>&&>std::is_convertible_v<std::optional<U>&, T>std::is_convertible_v<const std::optional<U>&, T>std::is_convertible_v<std::optional<U>&&, T>std::is_convertible_v<const std::optional<U>&&, T>
std::is_convertible_v<U&&, T> が false の場合、このコンストラクタは explicit になります。6) 引数
std::forward<Args>(args)... から T 型のオブジェクトを直接初期化 (しかし直接リスト初期化ではない) したかのように初期化された、値を格納している optional オブジェクトを構築します。 選択された T のコンストラクタが constexpr コンストラクタの場合、このコンストラクタは constexpr コンストラクタになります。 このコンストラクタは、 std::is_constructible_v<T, Args...> が true でなければ、オーバーロード解決に参加しません。7) 引数
ilist, std::forward<Args>(args)... から T 型のオブジェクトを直接初期化 (しかし直接リスト初期化ではない) したかのように初期化された、値を格納している optional オブジェクトを構築します。 選択された T のコンストラクタが constexpr コンストラクタの場合、このコンストラクタは constexpr コンストラクタになります。 このコンストラクタは、 std::is_constructible_v<T, std::initializer_list<U>&, Args&&...> が true でなければ、オーバーロード解決に参加しません。8) 式
std::forward<U>(value) を使用して T (ただし T = value_type) 型のオブジェクトを直接初期化 (しかし直接リスト初期化ではない) したかのように初期化された、値を格納している optional オブジェクトを構築します。 選択された 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> であれば、オーバーロード解決に参加しません。 std::is_convertible_v<U&&, T> が false の場合、このコンストラクタは explicit になります。引数
| other | - | 格納されている値をコピーする別の optional オブジェクト
|
| value | - | 格納される値を初期化するための値 |
| args... | - | 格納される値を初期化するための引数 |
| ilist | - | 格納される値を初期化するための初期化子リスト |
例外
2)
T のコンストラクタによって投げられるあらゆる例外を投げます。3)
T のコンストラクタによって投げられるあらゆる例外を投げます。 以下の noexcept 指定を持ちます。noexcept 指定:
noexcept(std::is_nothrow_move_constructible<T>::value)4-8)
T のコンストラクタによって投げられるあらゆる例外を投げます。推定ガイド
例
Run this code
#include <optional>
#include <iostream>
#include <string>
int main()
{
std::optional<int> o1, // empty
o2 = 1, // init from rvalue
o3 = o2; // copy-constructor
// calls std::string( initializer_list<CharT> ) constructor
std::optional<std::string> o4(std::in_place, {'a', 'b', 'c'});
// calls std::string( size_type count, CharT ch ) constructor
std::optional<std::string> o5(std::in_place, 3, 'A');
// Move-constructed from std::string using deduction guide to pick the type
std::optional o6(std::string{"deduction"});
std::cout << *o2 << ' ' << *o3 << ' ' << *o4 << ' ' << *o5 << ' ' << *o6 << '\n';
}
出力:
1 1 abc AAA deduction
欠陥報告
以下の動作変更欠陥報告は以前に発行された C++ 標準に遡って適用されました。
| DR | 適用先 | 発行時の動作 | 正しい動作 |
|---|---|---|---|
| P0602R4 | C++17 | copy/move constructors may not be trivial even if underlying constructor is trivial | required to propagate triviality |
関連項目
(C++17) |
optional オブジェクトを作成します (関数テンプレート) |