次の方法で共有


optional クラス

クラス テンプレート optional<T> は、格納されている値と呼ばれる T 型の値を含むか含まないかのオブジェクトを表します。

optional<T> のインスタンスに値が含まれている場合、格納されている値は、型 optional に対して適切にアラインされた領域内のオブジェクトのストレージ内に割り当てられますToptional<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&&) &&;

関連項目

<省略可能>