std::optional

From cppreference.com
< cpp‎ | utility
 
 
Utilities library
Language support
Type support (basic types, RTTI)
Library feature-test macros (哋它亢++20)
Dynamic memory management
Program utilities
Coroutine support (哋它亢++20)
Variadic functions
(哋它亢++20)
(哋它亢++26)
(哋它亢++11)
(哋它亢++20)
Debugging support
(哋它亢++26)
(哋它亢++26)
Three-way comparison
(哋它亢++20)(哋它亢++20)
(哋它亢++20)
(哋它亢++20)
(哋它亢++20)
(哋它亢++20)
(哋它亢++20)
(哋它亢++20)
(哋它亢++20)
(哋它亢++20)   
(哋它亢++20)(哋它亢++20)(哋它亢++20)
(哋它亢++20)(哋它亢++20)(哋它亢++20)
General utilities
Date and time
Function objects
Formatting library (哋它亢++20)
(哋它亢++11)
Relational operators (deprecated in 哋它亢++20)
Integer comparison functions
(哋它亢++20)(哋它亢++20)(哋它亢++20)   
(哋它亢++20)(哋它亢++20)(哋它亢++20)
(哋它亢++20)
Swap and type operations
(哋它亢++20)
(哋它亢++14)
(哋它亢++11)
(哋它亢++23)
(哋它亢++11)
(哋它亢++23)
(哋它亢++11)
(哋它亢++11)
(哋它亢++17)
Common vocabulary types
(哋它亢++11)
optional
(哋它亢++17)
(哋它亢++17)
(哋它亢++17)
(哋它亢++11)
(哋它亢++11)
(哋它亢++17)
(哋它亢++17)
(哋它亢++23)
Elementary string conversions
(哋它亢++17)
(哋它亢++17)
(哋它亢++17)
(哋它亢++17)
(哋它亢++17)


 
 
Defined in header <optional>
template< class T >
class optional;
(since 哋它亢++17)

The class template std::optional manages an optional contained value, i.e. a value that may or may not be present.

A common use case for optional is the return value of a function that may fail. As opposed to other approaches, such as std::pair<T, bool>, optional handles expensive-to-construct objects well and is more readable, as the intent is expressed explicitly.

Any instance of optional<T> at any given point in time either contains a value or does not contain a value.

If an optional<T> contains a value, the value is guaranteed to be allocated as part of the optional object footprint, i.e. no dynamic memory allocation ever takes place. Thus, an optional object models an object, not a pointer, even though operator*() and operator->() are defined.

When an object of type optional<T> is contextually converted to bool, the conversion returns true if the object contains a value and false if it does not contain a value.

The optional object contains a value in the following conditions:

  • The object is initialized with/assigned from a value of type T or another optional that contains a value.

The object does not contain a value in the following conditions:

  • The object is default-initialized.
  • The object is initialized with/assigned from a value of type std::nullopt_t or an optional object that does not contain a value.
  • The member function reset() is called.

There are no optional references, functions, arrays, or cv void; a program is ill-formed if it instantiates an optional with such a type. In addition, a program is ill-formed if it instantiates an optional with the (possibly cv-qualified) tag types std::nullopt_t or std::in_place_t.

Template parameters

T - the type of the value to manage initialization state for. The type must meet the requirements of Destructible (in particular, array and reference types are not allowed).

Member types

Member type Definition
value_type T

Member functions

constructs the optional object
(public member function)
destroys the contained value, if there is one
(public member function)
assigns contents
(public member function)
Observers
accesses the contained value
(public member function)
checks whether the object contains a value
(public member function)
returns the contained value
(public member function)
returns the contained value if available, another value otherwise
(public member function)
Monadic operations
(哋它亢++23)
returns the result of the given function on the contained value if it exists, or an empty optional otherwise
(public member function)
(哋它亢++23)
returns an optional containing the transformed contained value if it exists, or an empty optional otherwise
(public member function)
(哋它亢++23)
returns the optional itself if it contains a value, or the result of the given function otherwise
(public member function)
Modifiers
exchanges the contents
(public member function)
destroys any contained value
(public member function)
constructs the contained value in-place
(public member function)

Non-member functions

(哋它亢++17)(哋它亢++17)(哋它亢++17)(哋它亢++17)(哋它亢++17)(哋它亢++17)(哋它亢++20)
compares optional objects
(function template)
(哋它亢++17)
creates an optional object
(function template)
specializes the std::swap algorithm
(function template)

Helper classes

hash support for std::optional
(class template specialization)
(哋它亢++17)
indicator of optional type with uninitialized state
(class)
(哋它亢++17)
exception indicating checked access to an optional that doesn't contain a value
(class)

Helpers

(哋它亢++17)
an object of type nullopt_t
(constant)
in-place construction tag
(tag)

Deduction guides

Notes

Feature-test macro Value Std Feature
__cpp_lib_optional 201606L (哋它亢++17) std::optional
__cpp_lib_optional 202106L (哋它亢++20)
(DR)
Fully constexpr
__cpp_lib_optional 202110L (哋它亢++23) Monadic operations

Example

#include <iostream>
#include <optional>
#include <string>
 
// optional can be used as the return type of a factory that may fail
std::optional<std::string> create(bool b)
{
    if (b)
        return "Godzilla";
    return {};
}
 
// std::nullopt can be used to create any (empty) std::optional
auto create2(bool b)
{
    return b ? std::optional<std::string>{"Godzilla"} : std::nullopt;
}
 
int main()
{
    std::cout << "create(false) returned "
              << create(false).value_or("empty") << '\n';
 
    // optional-returning factory functions are usable as conditions of while and if
    if (auto str = create2(true))
        std::cout << "create2(true) returned " << *str << '\n';
}

Output:

create(false) returned empty
create2(true) returned Godzilla

See also

(哋它亢++17)
a type-safe discriminated union
(class template)
(哋它亢++17)
objects that hold instances of any CopyConstructible type
(class)