Partilhar via


Classe opcional

O modelo de classe optional<T> descreve um objeto que pode ou não conter um valor de tipo T, conhecido como o valor contido.

Quando uma instância de optional<T> contém um valor, o valor contido é alocado dentro da armazenagem do objeto optional em uma região adequadamente alinhada para o tipo T. Quando um optional<T> for convertido para bool, o resultado será true se o objeto contiver um valor; caso contrário, será false.

O tipo T de objeto contido não deve ser in_place_t ou nullopt_t. T deve ser destrutível, ou seja, seu destruidor deve recuperar todos os próprios recursos e não pode gerar exceções.

A classe optional é nova em C++17.

Sintaxe

template <class T>
class optional
{
    using value_type = T;
};

template<class T> optional(T) -> optional<T>;

Membros

Construtores

Nome Descrição
Construtores e destruidores
optional Constrói um objeto do tipo optional.
~optional Destrói um objeto do tipo optional.
Cessão
operator= Substitui o optional por uma cópia de outro optional.
emplace Inicializa o valor contido com argumentos especificados.
Swap
troca Troca o valor contido ou o estado vazio por outro optional.
Observadores
has_value Retorna caso um objeto optional contenha um valor.
value Retorna o valor contido.
value_or Retorna o valor contido ou uma alternativa se nenhum valor estiver presente.
operator-> Referencia o valor contido de um objeto optional.
operator* Referencia o valor contido de um objeto optional.
operator bool Retorna caso um objeto optional contenha um valor.
Modificadores
reset Redefine o optional destruindo qualquer valor contido.

has_value

constexpr bool has_value() const noexcept;

construtor opcional

Constrói um objeto do 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);

Parâmetros

rhs
O optional para copiar ou mover o constructo do valor contido.

i_lista
A lista de inicializadores para o constructo do valor contido.

args
A lista de argumentos para o constructo do valor contido.

Comentários

constexpr optional() noexcept;constexpr optional(nullopt_t nullopt) noexcept; Esses construtores constroem um optional que não contém um valor.

constexpr optional(const optional& rhs); O construtor de cópia inicializa o valor contido a partir do valor contido do argumento. Ele é definido como excluído, a menos que is_copy_constructible_v<T> seja verdadeiro, e é trivial se is_trivially_copy_constructible_v<T> for verdadeiro.

constexpr optional(optional&& rhs) noexcept; O construtor de movimentação inicializa o valor contido mudando o valor contido do argumento. Ele não participa da resolução de sobrecarga, a menos que is_move_constructible_v<T> seja verdadeiro, e é trivial se is_trivially_move_constructible_v<T> for verdadeiro.

template <class... Args> constexpr explicit optional(in_place_t, Args&&... args); Inicializa diretamente o valor contido como se estivesse usando os argumentos std::forward<Args>(args). Esse construtor será constexpr se o construtor T utilizado for constexpr. Ele não participa da resolução de sobrecarga, a menos que is_constructible_v<T, Args...> seja verdadeiro.

template <class U, class... Args> constexpr explicit optional(in_place_t, initializer_list<U> i_list, Args&&... args); Inicializa diretamente o valor contido como se estivesse usando os argumentos i_list, std::forward<Args>(args). Esse construtor será constexpr se o construtor T utilizado for constexpr. Ele não participa da resolução de sobrecarga, a menos que is_constructible_v<T, initializer_list<U>&, Args&&...> seja verdadeiro.

template <class U = T> explicit constexpr optional(U&& rhs); Inicializa diretamente o valor contido como se estivesse usando std::forward<U>(v). Esse construtor será constexpr se o construtor T utilizado for constexpr. Ele não participa da resolução de sobrecarga, a menos que is_constructible_v<T, U&&> seja verdadeiro, e is_same_v<remove_cvref_t<U>, in_place_t> e is_same_v<remove_cvref_t<U>, optional> sejam falsos.

template <class U> explicit optional(const optional<U>& rhs); Se rhs contiver um valor, inicializará diretamente o valor contido a partir do valor contido do argumento. Ele não participa da resolução de sobrecarga, a menos que is_constructible_v<T, const U&> seja verdadeiro e 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> e is_convertible_v<const optional<U>&&, T> sejam falsos.

template <class U> explicit optional(optional<U>&& rhs); Se rhs contiver um valor, inicializará diretamente o valor contido como se estivesse usando std::move(*rhs). Ele não participa da resolução de sobrecarga, a menos que is_constructible_v<T, U&&> seja verdadeiro e 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> e is_convertible_v<const optional<U>&&, T> sejam falsos.

destruidor ~optional

Destrói o valor contido, se houver um.

~optional();

Comentários

Se T for trivialmente destrutível, então optional<T> também será trivialmente destrutível.

operator=

Substitui o valor contido de um optional por uma cópia ou movimentação de outro valor contido 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->

Referência ao valor contido de um objeto optional.

constexpr const T* operator->() const;
constexpr T* operator->();

operator*

Referência ao valor contido de um objeto optional.

constexpr const T& operator*() const&;
constexpr T& operator*() &;
constexpr T&& operator*() &&;
constexpr const T&& operator*() const&&;

operator bool

Relata se o objeto optional tem um valor contido.

constexpr explicit operator bool() const noexcept;

reset

Efetivamente, chama o destruidor do objeto contido, se houver, e o define como um estado não inicializado.

void reset() noexcept;

troca

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&&) &&;

Confira também

<optional>