std::optional(3)

πŸ“¦
version 2024.07.05 Β· 4 versions
, in nixpkgs unstable, opensuse-leap 16.0

πŸ’– std::optional β€” the C++ Standard Library page, but make it a vibe ✨

okay so bestie, this is the manual page for std::optional(3) and it is literally the β€œmaybe there’s a value, maybe there isn’t” queen of C++17. no cap, she’s iconic. 🫢


🌸 NAME

std::optional β€” std::optional (yes bestie, that’s what the page says; the name is the name πŸ’…)


πŸ’« Synopsis

Defined in header <optional>:

template< class T >           (since C++17)
class optional;

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. πŸ’€ (like, she’s giving object, not pointer, periodt.)

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

  • value_type β€” T

πŸ› οΈ Member functions

  • constructor β€” constructs the optional object (public member function)
  • destructor β€” destroys the contained value, if there is one (public member function)
  • operator= β€” assigns contents (public member function)

πŸ‘€ Observers

  • operator-> β€” accesses the contained value (public member function)
  • operator* β€” accesses the contained value (public member function)
  • operator bool β€” checks whether the object contains a value (public member function)
  • has_value β€” checks whether the object contains a value (public member function)
  • value β€” returns the contained value (public member function)
  • value_or β€” returns the contained value if available, another value otherwise (public member function)

πŸͺ„ Monadic operations

  • and_then (C++23) β€” returns the result of the given function on the contained value if it exists, or an empty optional otherwise (public member function)
  • transform (C++23) β€” returns an optional containing the transformed contained value if it exists, or an empty optional otherwise (public member function)
  • or_else (C++23) β€” returns the optional itself if it contains a value, or the result of the given function otherwise (public member function)

πŸ”§ Modifiers

  • swap β€” exchanges the contents (public member function)
  • reset β€” destroys any contained value (public member function)
  • emplace β€” constructs the contained value in-place (public member function)

🫱 Non-member functions

  • operator== β€” compares optional objects (C++17) (function template)
  • operator!= β€” compares optional objects (C++17) (function template)
  • operator< β€” compares optional objects (C++17) (function template)
  • operator<= β€” compares optional objects (C++17) (function template)
  • operator> β€” compares optional objects (C++17) (function template)
  • operator>= β€” compares optional objects (C++17) (function template)
  • operator<=> β€” compares optional objects (C++20) (function template)
  • make_optional β€” creates an optional object (C++17) (function template)
  • std::swap(std::optional) β€” specializes the std::swap algorithm (C++17) (function template)

🧰 Helper classes

  • std::hash<std::optional> β€” hash support for std::optional (C++17) (class template specialization)
  • nullopt_t β€” indicator of optional type with uninitialized state (C++17) (class)
  • bad_optional_access β€” exception indicating checked access to an optional that doesn’t contain a value (C++17) (class)

🧚 Helpers

  • nullopt β€” an object of type nullopt_t (C++17) (constant)
  • in_place, in_place_type, in_place_index β€” in-place construction tag (tag) (C++17)
  • in_place_t, in_place_type_t, in_place_index_t β€” in-place construction tag (tag) (C++17)

🧞 Deduction guides

(this section is literally just the heading in the original β€” no extra bullet points listed, so we’re not inventing any πŸ’…)


πŸ“ Notes

Feature-test macro, value, standard, and feature:

  • __cpp_lib_optional 201606L (C++17) β€” std::optional
  • __cpp_lib_optional 202106L (C++20) β€” Fully constexpr (DR)
  • __cpp_lib_optional 202110L (C++23) β€” Monadic operations

🌈 Example

Run this code, bestie:

// Run this code

#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

  • variant β€” a type-safe discriminated union (C++17) (class template)
  • any β€” objects that hold instances of any CopyConstructible type (C++17) (class)

okay bye bestie 🫢 this page came from http://cppreference.com, version/date 2024.06.10 β€” now go make an optional that slays πŸ’…βœ¨

πŸ“¦ where this page comes from