Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Il modello optional<T>
di classe descrive un oggetto che può contenere o meno un valore di tipo T
, noto come valore contenuto.
Quando un'istanza di optional<T>
contiene un valore, il valore contenuto viene allocato all'interno dell'archivio dell'oggetto, in un'area optional
allineata in modo adeguato per il tipo T
. Quando un oggetto optional<T>
viene convertito in bool
, il risultato è true
se l'oggetto contiene un valore; in caso contrario, è false
.
Il tipo di T
oggetto contenuto non deve essere in_place_t
o nullopt_t
. T
deve essere distruttore, ovvero il distruttore deve recuperare tutte le risorse di proprietà e non generare eccezioni.
La optional
classe è nuova in C++17.
Sintassi
template <class T>
class optional
{
using value_type = T;
};
template<class T> optional(T) -> optional<T>;
Membri
Costruttori
Nome | Descrizione |
---|---|
Costruttori e distruttori | |
facoltativo | Costruisce un oggetto di tipo optional . |
~opzionale | Elimina definitivamente un oggetto di tipo optional . |
Assegnazione | |
operator= | optional Sostituisce con una copia di un altro optional oggetto . |
emplace | Inizializza il valore contenuto con gli argomenti specificati. |
Swap | |
swap | Scambia il valore contenuto o lo stato vuoto con un altro optional oggetto . |
Osservatori | |
has_value | Restituisce un valore che indica se un optional oggetto contiene un valore. |
value | Restituisce il valore contenuto. |
value_or | Restituisce il valore contenuto o un'alternativa se non è presente alcun valore. |
operator-> | Fa riferimento al valore contenuto di un optional oggetto . |
operator* | Fa riferimento al valore contenuto di un optional oggetto . |
operator bool | Restituisce un valore che indica se un optional oggetto contiene un valore. |
Modificatori | |
reset | Reimposta l'oggetto optional eliminando qualsiasi valore contenuto. |
has_value
constexpr bool has_value() const noexcept;
Costruttore facoltativo
Costruisce un oggetto di tipo 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);
Parametri
rhs
Oggetto optional
da cui copiare o spostare il valore contenuto.
i_list
Elenco di inizializzatori da cui costruire il valore contenuto.
args
Elenco di argomenti da cui costruire il valore contenuto.
Osservazioni:
constexpr optional() noexcept;
constexpr optional(nullopt_t nullopt) noexcept;
Questi costruttori costruiscono un oggetto optional
che non contiene un valore.
constexpr optional(const optional& rhs);
Il costruttore di copia inizializza il valore contenuto dal valore contenuto dell'argomento. Viene definito come eliminato , a meno che is_copy_constructible_v<T>
non sia true, ed è semplice se is_trivially_copy_constructible_v<T>
è true.
constexpr optional(optional&& rhs) noexcept;
Il costruttore di spostamento inizializza il valore contenuto spostando dal valore contenuto dell'argomento. Non partecipa alla risoluzione dell'overload, a meno che is_move_constructible_v<T>
non sia vero, ed è semplice se is_trivially_move_constructible_v<T>
è vero.
template <class... Args> constexpr explicit optional(in_place_t, Args&&... args);
Inizializza direttamente il valore contenuto come se si utilizzassero gli std::forward<Args>(args)
argomenti . Questo costruttore è constexpr
se il T
costruttore usato è constexpr
. Non partecipa alla risoluzione dell'overload, a meno che is_constructible_v<T, Args...>
non sia true.
template <class U, class... Args> constexpr explicit optional(in_place_t, initializer_list<U> i_list, Args&&... args);
Inizializza direttamente il valore contenuto come se si utilizzassero gli i_list, std::forward<Args>(args)
argomenti . Questo costruttore è constexpr
se il T
costruttore usato è constexpr
. Non partecipa alla risoluzione dell'overload, a meno che is_constructible_v<T, initializer_list<U>&, Args&&...>
non sia true.
template <class U = T> explicit constexpr optional(U&& rhs);
Inizializza direttamente il valore contenuto come se si usasse std::forward<U>(v)
. Questo costruttore è constexpr
se il T
costruttore usato è constexpr
. Non partecipa alla risoluzione dell'overload, a meno che is_constructible_v<T, U&&>
non sia true e is_same_v<remove_cvref_t<U>, optional>
is_same_v<remove_cvref_t<U>, in_place_t>
sia false.
template <class U> explicit optional(const optional<U>& rhs);
Se rhs contiene un valore, inizializza direttamente il valore contenuto dal valore contenuto dell'argomento. Non fa parte della risoluzione dell'overload, a meno che is_constructible_v<T, const U&>
non sia true e is_constructible_v<T, optional<U>&>
, , is_convertible_v<optional<U>&, T>
is_constructible_v<T, const optional<U>&&>
is_constructible_v<T, const optional<U>&>
is_convertible_v<optional<U>&&, T>
is_constructible_v<T, optional<U>&&>
, is_convertible_v<const optional<U>&, T>
e is_convertible_v<const optional<U>&&, T>
siano tutti false.
template <class U> explicit optional(optional<U>&& rhs);
Se rhs contiene un valore, inizializza direttamente il valore contenuto come se si usasse std::move(*rhs)
. Non fa parte della risoluzione dell'overload, a meno che is_constructible_v<T, U&&>
non sia true e is_constructible_v<T, optional<U>&>
, , is_convertible_v<optional<U>&, T>
is_constructible_v<T, const optional<U>&&>
is_constructible_v<T, const optional<U>&>
is_convertible_v<optional<U>&&, T>
is_constructible_v<T, optional<U>&&>
, is_convertible_v<const optional<U>&, T>
e is_convertible_v<const optional<U>&&, T>
siano tutti false.
Distruttore ~facoltativo
Elimina definitivamente il valore contenuto, se presente.
~optional();
Osservazioni:
Se T
è banalmente distruttore, è optional<T>
anche semplice destruibile.
operator=
Sostituisce il valore contenuto di un oggetto optional
con una copia o spostarlo da un altro optional
valore contenuto.
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&&...);
operatore->
Dereferenzia il valore contenuto di un optional
oggetto .
constexpr const T* operator->() const;
constexpr T* operator->();
operator*
Dereferenzia il valore contenuto di un optional
oggetto .
constexpr const T& operator*() const&;
constexpr T& operator*() &;
constexpr T&& operator*() &&;
constexpr const T&& operator*() const&&;
operator bool
Indica se l'oggetto optional
ha un valore contenuto.
constexpr explicit operator bool() const noexcept;
reset (ripristina)
In effetti, chiama il distruttore dell'oggetto contenuto, se presente, e lo imposta su uno stato non inizializzato.
void reset() noexcept;
scambio
template<class T>
void swap(optional<T>&, optional<T>&) noexcept;
value
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&&) &&;