Namespaces
Variants
Views
Actions

Difference between revisions of "cpp/utility/optional"

From cppreference.com
< cpp‎ | utility
m (Redirected page to enwiki:Rust (programming language))
(Undo revision 155926 by Rust (talk))
Line 1: Line 1:
#REDIRECT [[enwiki:Rust_(programming_language)]]
+
{{cpp/title|optional}}
 +
{{cpp/utility/optional/navbar}}
 +
{{ddcl|header=optional|since=c++17|
 +
template< class T >
 +
class optional;
 +
}}
 +
 
 +
The class template {{tt|std::optional}} manages an ''optional'' contained value, i.e. a value that may or may not be present.
 +
 
 +
A common use case for {{tt|optional}} is the return value of a function that may fail. As opposed to other approaches, such as {{c|std::pair<T,bool>}}, {{tt|optional}} handles expensive-to-construct objects well and is more readable, as the intent is expressed explicitly.
 +
 
 +
Any instance of {{tt|optional<T>}} at any given point in time either ''contains a value'' or ''does not contain a value''.
 +
 
 +
If an {{tt|optional<T>}} ''contains a value'', the value is guaranteed to be allocated as part of the {{tt|optional}} object footprint, i.e. no dynamic memory allocation ever takes place. Thus, an {{tt|optional}} object models an object, not a pointer, even though {{lc|operator*()}} and {{lc|operator->()}} are defined.
 +
 
 +
When an object of type {{tt|optional<T>}} is [[cpp/language/implicit_cast|contextually converted to {{tt|bool}}]], the conversion returns {{c|true}} if the object ''contains a value'' and {{c|false}} if it ''does not contain a value''.
 +
 
 +
The {{tt|optional}} object ''contains a value'' in the following conditions:
 +
 
 +
* The object is initialized with/assigned from a value of type {{tt|T}} or another {{tt|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 {{lc|std::nullopt_t}} or an  {{tt|optional}} object that ''does not contain a value''.
 +
* The member function {{lc|reset()}} is called.
 +
 
 +
There are no optional references; a program is ill-formed if it instantiates an {{tt|optional}} with a reference type. Alternatively, an {{tt|optional}} of a {{lc|std::reference_wrapper}} of type {{tt|T}} may be used to hold a reference. In addition, a program is ill-formed if it instantiates an {{tt|optional}} with the (possibly cv-qualified) tag types {{lc|std::nullopt_t}} or {{lc|std::in_place_t}}.
 +
 
 +
===Template parameters===
 +
{{par begin}}
 +
{{par|T|the type of the value to manage initialization state for. The type must meet the requirements of {{named req|Destructible}} (in particular, array and reference types are not allowed).}}
 +
{{par end}}
 +
 
 +
===Member types===
 +
{{dsc begin}}
 +
{{dsc hitem|Member type|Definition}}
 +
{{dsc|{{tt|value_type}}|{{tt|T}}}}
 +
{{dsc end}}
 +
 
 +
===Member functions===
 +
{{dsc begin}}
 +
{{dsc inc|cpp/utility/optional/dsc constructor}}
 +
{{dsc inc|cpp/utility/optional/dsc destructor}}
 +
{{dsc inc|cpp/utility/optional/dsc operator{{=}}}}
 +
 
 +
{{dsc h2|Observers}}
 +
{{dsc inc|cpp/utility/optional/dsc operator*}}
 +
{{dsc inc|cpp/utility/optional/dsc operator bool}}
 +
{{dsc inc|cpp/utility/optional/dsc value}}
 +
{{dsc inc|cpp/utility/optional/dsc value_or}}
 +
 
 +
{{dsc h2|Monadic operations}}
 +
{{dsc inc|cpp/utility/optional/dsc and_then}}
 +
{{dsc inc|cpp/utility/optional/dsc transform}}
 +
{{dsc inc|cpp/utility/optional/dsc or_else}}
 +
 
 +
{{dsc h2|Modifiers}}
 +
{{dsc inc|cpp/utility/optional/dsc swap}}
 +
{{dsc inc|cpp/utility/optional/dsc reset}}
 +
{{dsc inc|cpp/utility/optional/dsc emplace}}
 +
{{dsc end}}
 +
 
 +
===Non-member functions===
 +
{{dsc begin}}
 +
{{dsc inc|cpp/utility/optional/dsc operator_cmp}}
 +
{{dsc inc|cpp/utility/optional/dsc make_optional}}
 +
{{dsc inc|cpp/utility/optional/dsc swap2}}
 +
{{dsc end}}
 +
 
 +
===Helper classes===
 +
{{dsc begin}}
 +
{{dsc inc|cpp/utility/optional/dsc hash}}
 +
{{dsc inc|cpp/utility/optional/dsc nullopt_t}}
 +
{{dsc inc|cpp/utility/optional/dsc bad_optional_access}}
 +
{{dsc end}}
 +
 
 +
===Helpers ===
 +
{{dsc begin}}
 +
{{dsc inc|cpp/utility/optional/dsc nullopt}}
 +
{{dsc inc|cpp/utility/optional/dsc in_place}}
 +
{{dsc end}}
 +
 
 +
===[[cpp/utility/optional/deduction_guides|Deduction guides]]===
 +
 
 +
===Notes===
 +
{{ftm begin|std=1|comment=1}}
 +
{{ftm|std=C++17|value=201606L|__cpp_lib_optional|{{ttt|std::optional}}}}
 +
{{ftm|std=C++20|value=202106L|__cpp_lib_optional|Fully constexpr|dr=1}}
 +
{{ftm|std=C++23|value=202110L|__cpp_lib_optional|[[#Monadic operations|Monadic operations]]}}
 +
{{ftm end}}
 +
 
 +
===Example===
 +
{{example
 +
|code=
 +
#include <functional>
 +
#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;
 +
}
 +
 
 +
// std::reference_wrapper may be used to return a reference
 +
auto create_ref(bool b)
 +
{
 +
    static std::string value = "Godzilla";
 +
    return b ? std::optional<std::reference_wrapper<std::string>>{value}
 +
            : 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';
 +
 
 +
    if (auto str = create_ref(true))
 +
    {
 +
        // using get() to access the reference_wrapper's value
 +
        std::cout << "create_ref(true) returned " << str->get() << '\n';
 +
        str->get() = "Mothra";
 +
        std::cout << "modifying it changed it to " << str->get() << '\n';
 +
    }
 +
}
 +
|output=
 +
create(false) returned empty
 +
create2(true) returned Godzilla
 +
create_ref(true) returned Godzilla
 +
modifying it changed it to Mothra
 +
}}
 +
 
 +
===See also===
 +
{{dsc begin}}
 +
{{dsc inc|cpp/utility/dsc variant}}
 +
{{dsc inc|cpp/utility/dsc any}}
 +
{{dsc end}}
 +
 
 +
{{langlinks|es|ja|ru|zh}}

Revision as of 09:28, 31 July 2023

 
 
Utilities library
General utilities
Relational operators (deprecated in C++20)
 
 
Defined in header <optional>
template< class T >
class optional;
(since C++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; a program is ill-formed if it instantiates an optional with a reference type. Alternatively, an optional of a std::reference_wrapper of type T may be used to hold a reference. 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.

Contents

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) [edit]
destroys the contained value, if there is one
(public member function) [edit]
assigns contents
(public member function) [edit]
Observers
accesses the contained value
(public member function) [edit]
checks whether the object contains a value
(public member function) [edit]
returns the contained value
(public member function) [edit]
returns the contained value if available, another value otherwise
(public member function) [edit]
Monadic operations
(C++23)
returns the result of the given function on the contained value if it exists, or an empty optional otherwise
(public member function) [edit]
(C++23)
returns an optional containing the transformed contained value if it exists, or an empty optional otherwise
(public member function) [edit]
(C++23)
returns the optional itself if it contains a value, or the result of the given function otherwise
(public member function) [edit]
Modifiers
exchanges the contents
(public member function) [edit]
destroys any contained value
(public member function) [edit]
constructs the contained value in-place
(public member function) [edit]

Non-member functions

(C++17)(C++17)(C++17)(C++17)(C++17)(C++17)(C++20)
compares optional objects
(function template) [edit]
creates an optional object
(function template) [edit]
specializes the std::swap algorithm
(function template) [edit]

Helper classes

hash support for std::optional
(class template specialization) [edit]
(C++17)
indicator of an std::optional that does not contain a value
(class) [edit]
exception indicating checked access to an optional that doesn't contain a value
(class) [edit]

Helpers

(C++17)
an object of type nullopt_t
(constant) [edit]
in-place construction tag
(tag)[edit]

Deduction guides

Notes

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

Example

#include <functional>
#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;
}
 
// std::reference_wrapper may be used to return a reference
auto create_ref(bool b)
{
    static std::string value = "Godzilla";
    return b ? std::optional<std::reference_wrapper<std::string>>{value}
             : 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';
 
    if (auto str = create_ref(true))
    {
        // using get() to access the reference_wrapper's value
        std::cout << "create_ref(true) returned " << str->get() << '\n';
        str->get() = "Mothra";
        std::cout << "modifying it changed it to " << str->get() << '\n';
    }
}

Output:

create(false) returned empty
create2(true) returned Godzilla
create_ref(true) returned Godzilla
modifying it changed it to Mothra

See also

(C++17)
a type-safe discriminated union
(class template) [edit]
(C++17)
objects that hold instances of any CopyConstructible type
(class) [edit]