optional クラス
クラス テンプレート optional<T>
は、格納されている値と呼ばれる T
型の値を含むか含まないかのオブジェクトを表します。
optional<T>
のインスタンスに値が含まれている場合、格納されている値は、型 optional
に対して適切にアラインされた領域内のオブジェクトのストレージ内に割り当てられますT
。 optional<T>
が bool
に変換された場合、結果はオブジェクトに値が含まれている場合は true
になります。それ以外の場合は false
です。
包含オブジェクト型 T
は、 in_place_t
または nullopt_t
にすることはできません。 T
は破棄可能である必要があります。つまり、そのデストラクターは、所有しているすべてのリソースを再利用する必要があります。例外はスローされません。
optional
クラスは C++17 の新機能です。
構文
template <class T>
class optional
{
using value_type = T;
};
template<class T> optional(T) -> optional<T>;
メンバー
コンストラクター
名前 | 説明 |
---|---|
コンストラクターとデストラクター | |
省略可能 | optional 型のオブジェクトを構築します。 |
~optional | optional 型のオブジェクトを破棄します。 |
譲渡 | |
operator= | optional を別の optional のコピーに置き換えます。 |
emplace | 指定した引数を使用して、格納されている値を初期化します。 |
Swap | |
スワップ | 格納されている値または空の状態を別の optional と入れ替えます。 |
オブザーバー | |
has_value | optional オブジェクトに値が含まれているかどうかを返します。 |
value | 格納されている値を返します。 |
value_or | 格納されている値を返します。値が存在しない場合は代替値を返します。 |
operator-> | optional オブジェクトの格納されている値を参照します。 |
operator* | optional オブジェクトの格納されている値を参照します。 |
operator bool | optional オブジェクトに値が含まれているかどうかを返します。 |
修飾子 | |
reset | 格納されている値を破棄して、optional をリセットします。 |
has_value
constexpr bool has_value() const noexcept;
省略可能なコンストラクター
optional
型のオブジェクトを構築します。
constexpr optional() noexcept;
constexpr optional(nullopt_t nullopt) noexcept;
constexpr optional(const optional& rhs);
constexpr optional(optional&& rhs) noexcept;
template <class... Args>
constexpr explicit optional(in_place_t, Args&&... args);
template <class U, class... Args>
constexpr explicit optional(in_place_t, initializer_list<U> i_list, Args&&... args);
template <class U = T>
explicit constexpr optional(U&& rhs);
template <class U>
explicit optional(const optional<U>& rhs);
template <class U>
explicit optional(optional<U>&& rhs);
パラメーター
rhs
格納されている値の元のコンストラクトをコピーまたは移動する optional
。
i_list
格納されている値を構築する初期化子リスト。
args
格納されている値を構築する引数リスト。
解説
constexpr optional() noexcept;
constexpr optional(nullopt_t nullopt) noexcept;
これらのコンストラクターは、値を含まない optional
を構築します。
constexpr optional(const optional& rhs);
コピー コンストラクターは、引数の格納されている値から、格納されている値を初期化します。 is_copy_constructible_v<T>
が true でない限り、削除済みとして定義され、 is_trivially_copy_constructible_v<T>
が true の場合、トリビアル型です。
constexpr optional(optional&& rhs) noexcept;
移動コンストラクターは、引数の格納されている値から移動して、格納されている値を初期化します。 is_move_constructible_v<T>
が true である場合を除き、オーバーロードの解決に参加せず、is_trivially_move_constructible_v<T>
が true である場合、トリビアル型です。
template <class... Args> constexpr explicit optional(in_place_t, Args&&... args);
引数 std::forward<Args>(args)
を使用する場合と同様に、格納されている値を直接初期化します。 このコンストラクターは、使用される T
コンストラクターが constexpr
の場合 constexpr
です。 is_constructible_v<T, Args...>
が true である場合を除き、オーバーロードの解決に参加しません。
template <class U, class... Args> constexpr explicit optional(in_place_t, initializer_list<U> i_list, Args&&... args);
引数 i_list, std::forward<Args>(args)
を使用する場合と同様に、格納されている値を直接初期化します。 このコンストラクターは、使用される T
コンストラクターが constexpr
の場合 constexpr
です。 is_constructible_v<T, initializer_list<U>&, Args&&...>
が true である場合を除き、オーバーロードの解決に参加しません。
template <class U = T> explicit constexpr optional(U&& rhs);
std::forward<U>(v)
を使用する場合と同様に、格納されている値を直接初期化します。 このコンストラクターは、使用される T
コンストラクターが constexpr
の場合 constexpr
です。 is_constructible_v<T, U&&>
が true であり、is_same_v<remove_cvref_t<U>, in_place_t>
と is_same_v<remove_cvref_t<U>, optional>
が false である場合を除き、オーバーロードの解決に参加しません。
template <class U> explicit optional(const optional<U>& rhs);
rhs に値が含まれている場合は、引数の格納されている値から格納されている値を直接初期化します。 is_constructible_v<T, const U&>
が true であり、is_constructible_v<T, optional<U>&>
、is_constructible_v<T, optional<U>&&>
、is_constructible_v<T, const optional<U>&>
、is_constructible_v<T, const optional<U>&&>
、is_convertible_v<optional<U>&, T>
、is_convertible_v<optional<U>&&, T>
、is_convertible_v<const optional<U>&, T>
、is_convertible_v<const optional<U>&&, T>
がすべて false である場合を除き、オーバーロードの解決に参加しません。
template <class U> explicit optional(optional<U>&& rhs);
rhs に値が含まれている場合は、std::move(*rhs)
を使用する場合と同様に、格納されている値が直接初期化されます。 is_constructible_v<T, U&&>
が true であり、is_constructible_v<T, optional<U>&>
、is_constructible_v<T, optional<U>&&>
、is_constructible_v<T, const optional<U>&>
、is_constructible_v<T, const optional<U>&&>
、is_convertible_v<optional<U>&, T>
、is_convertible_v<optional<U>&&, T>
、is_convertible_v<const optional<U>&, T>
、is_convertible_v<const optional<U>&&, T>
がすべて false である場合を除き、オーバーロードの解決に参加しません。
~省略可能なデストラクター
含まれる値が存在する場合は破棄します。
~optional();
解説
T
が普通に破棄できる場合は、optional<T>
も普通に破棄できます。
operator=
optional
の格納されている値を、別の optional
の格納されている値からのコピーまたは移動に置き換えます。
optional& operator=(nullopt_t) noexcept;
optional& operator=(const optional& rhs);
optional& operator=(optional&&) noexcept( /* see below */ );
template <class U = T>
optional& operator=(U&&);
template <class U>
optional& operator=(const optional<U>&);
template <class U>
optional& operator=(optional<U>&&);
template <class... Args>
T& emplace(Args&&...);
template <class U, class... Args>
T& emplace(initializer_list<U>, Args&&...);
operator->
optional
オブジェクトの格納されている値を逆参照します。
constexpr const T* operator->() const;
constexpr T* operator->();
operator*
optional
オブジェクトの格納されている値を逆参照します。
constexpr const T& operator*() const&;
constexpr T& operator*() &;
constexpr T&& operator*() &&;
constexpr const T&& operator*() const&&;
operator bool
optional
オブジェクトに格納されている値があるかどうかを報告します。
constexpr explicit operator bool() const noexcept;
reset
実質的には、含まれているオブジェクトのデストラクター (該当する場合) を呼び出し、初期化されていない状態に設定します。
void reset() noexcept;
スワップ
template<class T>
void swap(optional<T>&, optional<T>&) noexcept;
値
constexpr const T& value() const&;
constexpr T& value() &;
constexpr T&& value() &&;
constexpr const T&& value() const&&;
value_or
template <class U>
constexpr T value_or(U&&) const&;
template <class U>
constexpr T value_or(U&&) &&;