Namespaces
Variants

cpp/experimental/optional: Difference between revisions

From cppreference.com
P12bot (talk | contribs)
m Use since= and until= params of {{ddcl}} template.
wording: start with semantics, move implementation down a few paragraphs
Line 6: Line 6:
}}
}}


The class template {{tt|std::optional}} manages an ''optional'' contained value. The value may be in either initialized or uninitialized state.
The class template {{tt|std::optional}} manages an ''optional'' contained value.value may be .


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.
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.


The value is guaranteed to be allocated within the {{tt|optional}} object itself, i.e. no dynamic memory allocation ever takes place. Thus, {{tt|optional}} object models an object, not a pointer, even though the {{lc|operator*()}} and {{lc|operator->()}} are defined.
The value is guaranteed to be allocated within the {{tt|optional}} object itself, i.e. no dynamic memory allocation ever takes place. Thus, {{tt|optional}} object models an object, not a pointer, even though the {{lc|operator*()}} and {{lc|operator->()}} are defined.


A {{tt|optional}} object with a value in initialized state is called ''engaged'', whereas if the value is in uninitialized state, the object is called ''disengaged''.
A {{tt|optional}} object with a value in initialized state is called ''engaged'', whereas if the value is in uninitialized state, the object is called ''disengaged''.


The {{tt|optional}} object is ''engaged'' on the following conditions:
The {{tt|optional}} object is ''engaged'' on the following conditions:

Revision as of 14:41, 16 August 2013

 
 
Utilities library
General utilities
Relational operators (deprecated in C++20)
 
 
Defined in header <optional>
template< class T >
class optional;
(since C++14)

The class template std::optional manages an optional contained value, i.e. a value that semantically 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.

The value is guaranteed to be allocated within the optional object itself, i.e. no dynamic memory allocation ever takes place. Thus, an optional object models an object, not a pointer, even though the operator*() and operator->() are defined.

The value inside an optional object may be in either an initialized or uninitialized state. A optional object with a value in initialized state is called engaged, whereas if the value is in uninitialized state, the object is called disengaged.

The optional object is engaged on the following conditions:

  • The object is initialized with a value of type T
  • The object is assigned an engaged optional.

The object is disengaged on the following conditions:

  • The object is default-initialized.
  • The object is initialized with a value of std::nullopt_t or a disengaged optional object.
  • The object is assigned a value of std::nullopt_t or a disengaged optional.

Template parameters

T - the type of the value to manage initialization state for. The type must meet the requirements of Template:concept

Member types

Member type Definition
value_type T

Member functions

constructs the optional object
(public member function of std::optional<T>) [edit]
destroys the contained value, if there is one
(public member function of std::optional<T>)