名前空間
変種

std::optional<T>::optional

提供: cppreference.com
 
 
ユーティリティライブラリ
汎用ユーティリティ
日付と時間
関数オブジェクト
書式化ライブラリ (C++20)
(C++11)
関係演算子 (C++20で非推奨)
整数比較関数
(C++20)
スワップと型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
一般的な語彙の型
(C++11)
(C++17)
(C++17)
(C++17)
(C++17)

初等文字列変換
(C++17)
(C++17)
 
 
<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 である
  • Tstd::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 である
  • Tstd::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 のコンストラクタによって投げられるあらゆる例外を投げます。

推定ガイド

#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]