Bemærk
Adgang til denne side kræver godkendelse. Du kan prøve at logge på eller ændre mapper.
Adgang til denne side kræver godkendelse. Du kan prøve at ændre mapper.
The class template optional<T> describes an object that may or may not contain a value of type T, known as the contained value.
When an instance of optional<T> contains a value, the contained value is allocated within the storage of the optional object, in a region suitably aligned for type T. When an optional<T> is converted to bool, the result is true if the object contains a value; otherwise, it's false.
The contained object type T must not be in_place_t or nullopt_t. T must be destructible, that is, its destructor must reclaim all owned resources, and may throw no exceptions.
The optional class is new in C++17.
Syntax
template <class T>
class optional
{
using value_type = T;
};
template<class T> optional(T) -> optional<T>;
Members
Constructors
| Name | Description |
|---|---|
| Constructors and destructor | |
| optional | Constructs an object of type optional. |
| ~optional | Destroys an object of type optional. |
| Assignment | |
| operator= | Replaces the optional with a copy of another optional. |
| emplace | Initializes the contained value with specified arguments. |
| Swap | |
| swap | Swaps the contained value or the empty state with another optional. |
| Observers | |
| has_value | Returns whether an optional object contains a value. |
| value | Returns the contained value. |
| value_or | Returns the contained value, or an alternative if no value is present. |
| operator-> | References the contained value of an optional object. |
| operator* | References the contained value of an optional object. |
| operator bool | Returns whether an optional object contains a value. |
| Modifiers | |
| reset | Resets the optional by destroying any contained value. |
has_value
constexpr bool has_value() const noexcept;
optional constructor
Constructs an object of type 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);
Parameters
rhs
The optional to copy or move construct the contained value from.
i_list
The initializer list to construct the contained value from.
args
The argument list to construct the contained value from.
Remarks
constexpr optional() noexcept;
constexpr optional(nullopt_t nullopt) noexcept;
These constructors construct an optional that doesn't contain a value.
constexpr optional(const optional& rhs);
The copy constructor initializes the contained value from the contained value of the argument. It's defined as deleted unless is_copy_constructible_v<T> is true, and it's trivial if is_trivially_copy_constructible_v<T> is true.
constexpr optional(optional&& rhs) noexcept;
The move constructor initializes the contained value by moving from the contained value of the argument. It doesn't participate in overload resolution unless is_move_constructible_v<T> is true, and it's trivial if is_trivially_move_constructible_v<T> is true.
template <class... Args> constexpr explicit optional(in_place_t, Args&&... args);
Direct initializes the contained value as if using the arguments std::forward<Args>(args). This constructor is constexpr if the T constructor used is constexpr. It doesn't participate in overload resolution unless is_constructible_v<T, Args...> is true.
template <class U, class... Args> constexpr explicit optional(in_place_t, initializer_list<U> i_list, Args&&... args);
Direct initializes the contained value as if using the arguments i_list, std::forward<Args>(args). This constructor is constexpr if the T constructor used is constexpr. It doesn't participate in overload resolution unless is_constructible_v<T, initializer_list<U>&, Args&&...> is true.
template <class U = T> explicit constexpr optional(U&& rhs);
Direct initializes the contained value as if using std::forward<U>(v). This constructor is constexpr if the T constructor used is constexpr. It doesn't participate in overload resolution unless is_constructible_v<T, U&&> is true, and is_same_v<remove_cvref_t<U>, in_place_t> and is_same_v<remove_cvref_t<U>, optional> are false.
template <class U> explicit optional(const optional<U>& rhs);
If rhs contains a value, direct initializes the contained value from the contained value of the argument. It doesn't participate in overload resolution unless is_constructible_v<T, const U&> is true, and 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>, and is_convertible_v<const optional<U>&&, T> are all false.
template <class U> explicit optional(optional<U>&& rhs);
If rhs contains a value, direct initializes the contained value as if using std::move(*rhs). It doesn't participate in overload resolution unless is_constructible_v<T, U&&> is true, and 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>, and is_convertible_v<const optional<U>&&, T> are all false.
~optional destructor
Destroys the contained value, if one is present.
~optional();
Remarks
If T is trivially destructible, then optional<T> is also trivially destructible.
operator=
Replaces the contained value of an optional with a copy or move from another optional contained value.
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->
Dereferences the contained value of an optional object.
constexpr const T* operator->() const;
constexpr T* operator->();
operator*
Dereferences the contained value of an optional object.
constexpr const T& operator*() const&;
constexpr T& operator*() &;
constexpr T&& operator*() &&;
constexpr const T&& operator*() const&&;
operator bool
Reports whether the optional object has a contained value.
constexpr explicit operator bool() const noexcept;
reset
Effectively, calls the destructor of the contained object, if any, and sets it to an uninitialized state.
void reset() noexcept;
swap
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&&) &&;