名前空間
変種
操作

std::optional<T>::optional

提供: cppreference.com
< cpp‎ | utility‎ | 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以上)
(条件付き 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_convertible_v<const U&, T>false の場合、このコンストラクタは explicit になります。
5) 変換ムーブコンストラクタ。 other が値を格納していない場合は、値を格納していない optional を構築します。 そうでなければ、式 std::move(*other) を使用して T 型のオブジェクトを直接初期化 (しかし直接リスト初期化ではない) したかのように初期化された、値を格納している optional オブジェクトを構築します。 このコンストラクタは、以下の条件が満たされなければ、オーバーロード解決に参加しません。
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 指定:  
4-8) T のコンストラクタによって投げられるあらゆる例外を投げます。

[編集] 推定ガイド

[編集]

#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

[編集] 関連項目

optional オブジェクトを作成します
(関数テンプレート) [edit]