3 <meta http-equiv=
"Content-Type" content=
"text/html; charset=US-ASCII">
4 <title>Detailed Semantics
</title>
5 <link rel=
"stylesheet" href=
"../../../../../doc/src/boostbook.css" type=
"text/css">
6 <meta name=
"generator" content=
"DocBook XSL Stylesheets V1.78.1">
7 <link rel=
"home" href=
"../index.html" title=
"Chapter 1. Boost.Optional">
8 <link rel=
"up" href=
"../index.html" title=
"Chapter 1. Boost.Optional">
9 <link rel=
"prev" href=
"synopsis.html" title=
"Synopsis">
10 <link rel=
"next" href=
"dependencies_and_portability.html" title=
"Dependencies and Portability">
12 <body bgcolor=
"white" text=
"black" link=
"#0000FF" vlink=
"#840084" alink=
"#0000FF">
13 <table cellpadding=
"2" width=
"100%"><tr>
14 <td valign=
"top"><img alt=
"Boost C++ Libraries" width=
"277" height=
"86" src=
"../../../../../boost.png"></td>
15 <td align=
"center"><a href=
"../../../../../index.html">Home
</a></td>
16 <td align=
"center"><a href=
"../../../../../libs/libraries.htm">Libraries
</a></td>
17 <td align=
"center"><a href=
"http://www.boost.org/users/people.html">People
</a></td>
18 <td align=
"center"><a href=
"http://www.boost.org/users/faq.html">FAQ
</a></td>
19 <td align=
"center"><a href=
"../../../../../more/index.htm">More
</a></td>
22 <div class=
"spirit-nav">
23 <a accesskey=
"p" href=
"synopsis.html"><img src=
"../../../../../doc/src/images/prev.png" alt=
"Prev"></a><a accesskey=
"u" href=
"../index.html"><img src=
"../../../../../doc/src/images/up.png" alt=
"Up"></a><a accesskey=
"h" href=
"../index.html"><img src=
"../../../../../doc/src/images/home.png" alt=
"Home"></a><a accesskey=
"n" href=
"dependencies_and_portability.html"><img src=
"../../../../../doc/src/images/next.png" alt=
"Next"></a>
26 <div class=
"titlepage"><div><div><h2 class=
"title" style=
"clear: both">
27 <a name=
"boost_optional.detailed_semantics"></a><a class=
"link" href=
"detailed_semantics.html" title=
"Detailed Semantics">Detailed Semantics
</a>
28 </h2></div></div></div>
30 Because
<code class=
"computeroutput"><span class=
"identifier">T
</span></code> might be of reference
31 type, in the sequel, those entries whose semantic depends on
<code class=
"computeroutput"><span class=
"identifier">T
</span></code> being of reference type or not will be
32 distinguished using the following convention:
34 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
36 If the entry reads:
<code class=
"computeroutput"><span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span></code><span class=
"emphasis"><em>(not
37 a ref)
</em></span><code class=
"computeroutput"><span class=
"special">></span></code>, the
38 description corresponds only to the case where
<code class=
"computeroutput"><span class=
"identifier">T
</span></code>
39 is not of reference type.
42 If the entry reads:
<code class=
"computeroutput"><span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">&></span></code>, the description corresponds only
43 to the case where
<code class=
"computeroutput"><span class=
"identifier">T
</span></code> is
47 If the entry reads:
<code class=
"computeroutput"><span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span></code>, the description is the same for both
51 <div class=
"note"><table border=
"0" summary=
"Note">
53 <td rowspan=
"2" align=
"center" valign=
"top" width=
"25"><img alt=
"[Note]" src=
"../../../../../doc/src/images/note.png"></td>
54 <th align=
"left">Note
</th>
56 <tr><td align=
"left" valign=
"top"><p>
57 The following section contains various
<code class=
"computeroutput"><span class=
"identifier">assert
</span><span class=
"special">()
</span></code> which are used only to show the postconditions
58 as sample code. It is not implied that the type
<code class=
"computeroutput"><span class=
"identifier">T
</span></code>
59 must support each particular expression but that if the expression is supported,
60 the implied condition holds.
64 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
67 <a name=
"boost_optional.detailed_semantics.h0"></a>
68 <span class=
"phrase"><a name=
"boost_optional.detailed_semantics.optional_class_member_functions"></a></span><a class=
"link" href=
"detailed_semantics.html#boost_optional.detailed_semantics.optional_class_member_functions">optional
69 class member functions
</a>
72 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
74 <a name=
"reference_optional_constructor"></a><div class=
"blockquote"><blockquote class=
"blockquote"><p>
75 <code class=
"computeroutput"><span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">>::
</span><span class=
"identifier">optional
</span><span class=
"special">()
</span> <span class=
"keyword">noexcept
</span><span class=
"special">;
</span></code>
76 </p></blockquote></div>
77 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
79 <span class=
"bold"><strong>Effect:
</strong></span> Default-Constructs an
<code class=
"computeroutput"><span class=
"identifier">optional
</span></code>.
82 <span class=
"bold"><strong>Postconditions:
</strong></span> <code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is
<span class=
"underline">uninitialized
</span>.
85 <span class=
"bold"><strong>Notes:
</strong></span> T's default constructor
<span class=
"underline">is not
</span> called.
88 <span class=
"bold"><strong>Example:
</strong></span>
89 <pre class=
"programlisting"><span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"identifier">def
</span> <span class=
"special">;
</span>
90 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"special">!
</span><span class=
"identifier">def
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
95 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
97 <a name=
"reference_optional_constructor_none_t"></a><div class=
"blockquote"><blockquote class=
"blockquote"><p>
98 <code class=
"computeroutput"><span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">>::
</span><span class=
"identifier">optional
</span><span class=
"special">(
</span> <span class=
"identifier">none_t
</span> <span class=
"special">)
</span> <span class=
"keyword">noexcept
</span><span class=
"special">;
</span></code>
99 </p></blockquote></div>
100 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
101 <li class=
"listitem">
102 <span class=
"bold"><strong>Effect:
</strong></span> Constructs an
<code class=
"computeroutput"><span class=
"identifier">optional
</span></code>
105 <li class=
"listitem">
106 <span class=
"bold"><strong>Postconditions:
</strong></span> <code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is
<span class=
"underline">uninitialized
</span>.
108 <li class=
"listitem">
109 <span class=
"bold"><strong>Notes:
</strong></span> <code class=
"computeroutput"><span class=
"identifier">T
</span></code>'s
110 default constructor
<span class=
"underline">is not
</span> called.
111 The expression
<code class=
"computeroutput"><span class=
"identifier">boost
</span><span class=
"special">::
</span><span class=
"identifier">none
</span></code> denotes an instance of
<code class=
"computeroutput"><span class=
"identifier">boost
</span><span class=
"special">::
</span><span class=
"identifier">none_t
</span></code> that can be used as the parameter.
113 <li class=
"listitem">
114 <span class=
"bold"><strong>Example:
</strong></span>
115 <pre class=
"programlisting"><span class=
"preprocessor">#include
</span> <span class=
"special"><</span><span class=
"identifier">boost
</span><span class=
"special">/
</span><span class=
"identifier">none
</span><span class=
"special">.
</span><span class=
"identifier">hpp
</span><span class=
"special">></span>
116 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"identifier">n
</span><span class=
"special">(
</span><span class=
"identifier">none
</span><span class=
"special">)
</span> <span class=
"special">;
</span>
117 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"special">!
</span><span class=
"identifier">n
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
122 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
124 <a name=
"reference_optional_constructor_value"></a><div class=
"blockquote"><blockquote class=
"blockquote"><p>
125 <code class=
"computeroutput"><span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span> </code><span class=
"emphasis"><em>(not a ref)
</em></span><code class=
"computeroutput"><span class=
"special">>::
</span><span class=
"identifier">optional
</span><span class=
"special">(
</span> <span class=
"identifier">T
</span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"identifier">v
</span> <span class=
"special">)
</span></code>
126 </p></blockquote></div>
127 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
128 <li class=
"listitem">
129 <span class=
"bold"><strong>Requires:
</strong></span> <code class=
"computeroutput"><span class=
"identifier">is_copy_constructible
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">>::
</span><span class=
"identifier">value
</span></code>
130 is
<code class=
"computeroutput"><span class=
"keyword">true
</span></code>.
132 <li class=
"listitem">
133 <span class=
"bold"><strong>Effect:
</strong></span> Directly-Constructs an
<code class=
"computeroutput"><span class=
"identifier">optional
</span></code>.
135 <li class=
"listitem">
136 <span class=
"bold"><strong>Postconditions:
</strong></span> <code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is
<span class=
"underline">initialized
</span>
137 and its value is a
<span class=
"emphasis"><em>copy
</em></span> of
<code class=
"computeroutput"><span class=
"identifier">v
</span></code>.
139 <li class=
"listitem">
140 <span class=
"bold"><strong>Throws:
</strong></span> Whatever
<code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">::
</span><span class=
"identifier">T
</span><span class=
"special">(
</span>
141 <span class=
"identifier">T
</span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"special">)
</span></code>
144 <li class=
"listitem">
145 <span class=
"bold"><strong>Notes:
</strong></span> <code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">::
</span><span class=
"identifier">T
</span><span class=
"special">(
</span>
146 <span class=
"identifier">T
</span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"special">)
</span></code>
149 <li class=
"listitem">
150 <span class=
"bold"><strong>Exception Safety:
</strong></span> Exceptions can only
151 be thrown during
<code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">::
</span><span class=
"identifier">T
</span><span class=
"special">(
</span> <span class=
"identifier">T
</span>
152 <span class=
"keyword">const
</span><span class=
"special">&</span>
153 <span class=
"special">);
</span></code> in that case, this constructor
156 <li class=
"listitem">
157 <span class=
"bold"><strong>Example:
</strong></span>
158 <pre class=
"programlisting"><span class=
"identifier">T
</span> <span class=
"identifier">v
</span><span class=
"special">;
</span>
159 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"identifier">opt
</span><span class=
"special">(
</span><span class=
"identifier">v
</span><span class=
"special">);
</span>
160 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"special">*
</span><span class=
"identifier">opt
</span> <span class=
"special">==
</span> <span class=
"identifier">v
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
165 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
167 <div class=
"blockquote"><blockquote class=
"blockquote"><p>
168 <code class=
"computeroutput"><span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">&>::
</span><span class=
"identifier">optional
</span><span class=
"special">(
</span> <span class=
"identifier">T
</span><span class=
"special">&</span> <span class=
"identifier">ref
</span> <span class=
"special">)
</span></code>
169 </p></blockquote></div>
170 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
171 <li class=
"listitem">
172 <span class=
"bold"><strong>Effect:
</strong></span> Directly-Constructs an
<code class=
"computeroutput"><span class=
"identifier">optional
</span></code>.
174 <li class=
"listitem">
175 <span class=
"bold"><strong>Postconditions:
</strong></span> <code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is
<span class=
"underline">initialized
</span>
176 and its value is an instance of an internal type wrapping the reference
177 <code class=
"computeroutput"><span class=
"identifier">ref
</span></code>.
179 <li class=
"listitem">
180 <span class=
"bold"><strong>Throws:
</strong></span> Nothing.
182 <li class=
"listitem">
183 <span class=
"bold"><strong>Example:
</strong></span>
184 <pre class=
"programlisting"><span class=
"identifier">T
</span> <span class=
"identifier">v
</span><span class=
"special">;
</span>
185 <span class=
"identifier">T
</span><span class=
"special">&</span> <span class=
"identifier">vref
</span> <span class=
"special">=
</span> <span class=
"identifier">v
</span> <span class=
"special">;
</span>
186 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">&></span> <span class=
"identifier">opt
</span><span class=
"special">(
</span><span class=
"identifier">vref
</span><span class=
"special">);
</span>
187 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"special">*
</span><span class=
"identifier">opt
</span> <span class=
"special">==
</span> <span class=
"identifier">v
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
188 <span class=
"special">++
</span> <span class=
"identifier">v
</span> <span class=
"special">;
</span> <span class=
"comment">// mutate referee
</span>
189 <span class=
"identifier">assert
</span> <span class=
"special">(*
</span><span class=
"identifier">opt
</span> <span class=
"special">==
</span> <span class=
"identifier">v
</span><span class=
"special">);
</span>
194 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
196 <a name=
"reference_optional_constructor_move_value"></a><div class=
"blockquote"><blockquote class=
"blockquote"><p>
197 <code class=
"computeroutput"><span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span> </code><span class=
"emphasis"><em>(not a ref)
</em></span><code class=
"computeroutput"><span class=
"special">>::
</span><span class=
"identifier">optional
</span><span class=
"special">(
</span> <span class=
"identifier">T
</span><span class=
"special">&&</span>
198 <span class=
"identifier">v
</span> <span class=
"special">)
</span></code>
199 </p></blockquote></div>
200 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
201 <li class=
"listitem">
202 <span class=
"bold"><strong>Requires:
</strong></span> <code class=
"computeroutput"><span class=
"identifier">is_move_constructible
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">>::
</span><span class=
"identifier">value
</span></code>
203 is
<code class=
"computeroutput"><span class=
"keyword">true
</span></code>.
205 <li class=
"listitem">
206 <span class=
"bold"><strong>Effect:
</strong></span> Directly-Move-Constructs an
<code class=
"computeroutput"><span class=
"identifier">optional
</span></code>.
208 <li class=
"listitem">
209 <span class=
"bold"><strong>Postconditions:
</strong></span> <code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is
<span class=
"underline">initialized
</span>
210 and its value is move-constructed from
<code class=
"computeroutput"><span class=
"identifier">v
</span></code>.
212 <li class=
"listitem">
213 <span class=
"bold"><strong>Throws:
</strong></span> Whatever
<code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">::
</span><span class=
"identifier">T
</span><span class=
"special">(
</span>
214 <span class=
"identifier">T
</span><span class=
"special">&&</span>
215 <span class=
"special">)
</span></code> throws.
217 <li class=
"listitem">
218 <span class=
"bold"><strong>Notes:
</strong></span> <code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">::
</span><span class=
"identifier">T
</span><span class=
"special">(
</span>
219 <span class=
"identifier">T
</span><span class=
"special">&&</span>
220 <span class=
"special">)
</span></code> is called.
222 <li class=
"listitem">
223 <span class=
"bold"><strong>Exception Safety:
</strong></span> Exceptions can only
224 be thrown during
<code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">::
</span><span class=
"identifier">T
</span><span class=
"special">(
</span> <span class=
"identifier">T
</span><span class=
"special">&&</span> <span class=
"special">);
</span></code>
225 in that case, the state of
<code class=
"computeroutput"><span class=
"identifier">v
</span></code>
226 is determined by exception safety guarantees for
<code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">::
</span><span class=
"identifier">T
</span><span class=
"special">(
</span><span class=
"identifier">T
</span><span class=
"special">&&)
</span></code>.
228 <li class=
"listitem">
229 <span class=
"bold"><strong>Example:
</strong></span>
230 <pre class=
"programlisting"><span class=
"identifier">T
</span> <span class=
"identifier">v1
</span><span class=
"special">,
</span> <span class=
"identifier">v2
</span><span class=
"special">;
</span>
231 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"identifier">opt
</span><span class=
"special">(
</span><span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">move
</span><span class=
"special">(
</span><span class=
"identifier">v1
</span><span class=
"special">));
</span>
232 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"special">*
</span><span class=
"identifier">opt
</span> <span class=
"special">==
</span> <span class=
"identifier">v2
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
237 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
239 <div class=
"blockquote"><blockquote class=
"blockquote"><p>
240 <code class=
"computeroutput"><span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">&>::
</span><span class=
"identifier">optional
</span><span class=
"special">(
</span> <span class=
"identifier">T
</span><span class=
"special">&&</span> <span class=
"identifier">ref
</span> <span class=
"special">)
</span> <span class=
"special">=
</span> <span class=
"keyword">delete
</span></code>
241 </p></blockquote></div>
242 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; "><li class=
"listitem">
243 <span class=
"bold"><strong>Notes:
</strong></span> This constructor is deleted
246 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
248 <a name=
"reference_optional_constructor_bool_value"></a><div class=
"blockquote"><blockquote class=
"blockquote"><p>
249 <code class=
"computeroutput"><span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span></code> <span class=
"emphasis"><em>(not a ref)
</em></span><code class=
"computeroutput"><span class=
"special">>::
</span><span class=
"identifier">optional
</span><span class=
"special">(
</span> <span class=
"keyword">bool
</span> <span class=
"identifier">condition
</span><span class=
"special">,
</span> <span class=
"identifier">T
</span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"identifier">v
</span> <span class=
"special">)
</span> <span class=
"special">;
</span></code>
250 </p></blockquote></div>
251 <div class=
"blockquote"><blockquote class=
"blockquote"><p>
252 <code class=
"computeroutput"><span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">&></span> <span class=
"special">::
</span><span class=
"identifier">optional
</span><span class=
"special">(
</span> <span class=
"keyword">bool
</span> <span class=
"identifier">condition
</span><span class=
"special">,
</span> <span class=
"identifier">T
</span><span class=
"special">&</span>
253 <span class=
"identifier">v
</span> <span class=
"special">)
</span> <span class=
"special">;
</span></code>
254 </p></blockquote></div>
255 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; "><li class=
"listitem">
256 If condition is true, same as:
258 <div class=
"blockquote"><blockquote class=
"blockquote"><p>
259 <code class=
"computeroutput"><span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span></code> <span class=
"emphasis"><em>(not a ref)
</em></span><code class=
"computeroutput"><span class=
"special">>::
</span><span class=
"identifier">optional
</span><span class=
"special">(
</span> <span class=
"identifier">T
</span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"identifier">v
</span> <span class=
"special">)
</span></code>
260 </p></blockquote></div>
261 <div class=
"blockquote"><blockquote class=
"blockquote"><p>
262 <code class=
"computeroutput"><span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">&></span> <span class=
"special">::
</span><span class=
"identifier">optional
</span><span class=
"special">(
</span> <span class=
"identifier">T
</span><span class=
"special">&</span>
263 <span class=
"identifier">v
</span> <span class=
"special">)
</span></code>
264 </p></blockquote></div>
265 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; "><li class=
"listitem">
268 <div class=
"blockquote"><blockquote class=
"blockquote"><p>
269 <code class=
"computeroutput"><span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span> </code><span class=
"emphasis"><em>(not a ref)
</em></span><code class=
"computeroutput"><span class=
"special">>::
</span><span class=
"identifier">optional
</span><span class=
"special">()
</span></code>
270 </p></blockquote></div>
271 <div class=
"blockquote"><blockquote class=
"blockquote"><p>
272 <code class=
"computeroutput"><span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">&></span> <span class=
"special">::
</span><span class=
"identifier">optional
</span><span class=
"special">()
</span></code>
273 </p></blockquote></div>
275 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
277 <a name=
"reference_optional_constructor_optional"></a><div class=
"blockquote"><blockquote class=
"blockquote"><p>
278 <code class=
"computeroutput"><span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span> </code><span class=
"emphasis"><em>(not a ref)
</em></span><code class=
"computeroutput"><span class=
"special">>::
</span><span class=
"identifier">optional
</span><span class=
"special">(
</span> <span class=
"identifier">optional
</span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"identifier">rhs
</span> <span class=
"special">);
</span></code>
279 </p></blockquote></div>
280 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
281 <li class=
"listitem">
282 <span class=
"bold"><strong>Requires:
</strong></span> <code class=
"computeroutput"><span class=
"identifier">is_copy_constructible
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">>::
</span><span class=
"identifier">value
</span></code>
283 is
<code class=
"computeroutput"><span class=
"keyword">true
</span></code>.
285 <li class=
"listitem">
286 <span class=
"bold"><strong>Effect:
</strong></span> Copy-Constructs an
<code class=
"computeroutput"><span class=
"identifier">optional
</span></code>.
288 <li class=
"listitem">
289 <span class=
"bold"><strong>Postconditions:
</strong></span> If rhs is initialized,
290 <code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code>
291 is initialized and its value is a
<span class=
"emphasis"><em>copy
</em></span> of the value
292 of
<code class=
"computeroutput"><span class=
"identifier">rhs
</span></code>; else
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is
295 <li class=
"listitem">
296 <span class=
"bold"><strong>Throws:
</strong></span> Whatever
<code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">::
</span><span class=
"identifier">T
</span><span class=
"special">(
</span>
297 <span class=
"identifier">T
</span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"special">)
</span></code>
300 <li class=
"listitem">
301 <span class=
"bold"><strong>Notes:
</strong></span> If rhs is initialized,
<code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">::
</span><span class=
"identifier">T
</span><span class=
"special">(
</span><span class=
"identifier">T
</span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"special">)
</span></code>
304 <li class=
"listitem">
305 <span class=
"bold"><strong>Exception Safety:
</strong></span> Exceptions can only
306 be thrown during
<code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">::
</span><span class=
"identifier">T
</span><span class=
"special">(
</span> <span class=
"identifier">T
</span>
307 <span class=
"keyword">const
</span><span class=
"special">&</span>
308 <span class=
"special">);
</span></code> in that case, this constructor
311 <li class=
"listitem">
312 <span class=
"bold"><strong>Example:
</strong></span>
313 <pre class=
"programlisting"><span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"identifier">uninit
</span> <span class=
"special">;
</span>
314 <span class=
"identifier">assert
</span> <span class=
"special">(!
</span><span class=
"identifier">uninit
</span><span class=
"special">);
</span>
316 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"identifier">uinit2
</span> <span class=
"special">(
</span> <span class=
"identifier">uninit
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
317 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"identifier">uninit2
</span> <span class=
"special">==
</span> <span class=
"identifier">uninit
</span> <span class=
"special">);
</span>
319 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"identifier">init
</span><span class=
"special">(
</span> <span class=
"identifier">T
</span><span class=
"special">(
</span><span class=
"number">2</span><span class=
"special">)
</span> <span class=
"special">);
</span>
320 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"special">*
</span><span class=
"identifier">init
</span> <span class=
"special">==
</span> <span class=
"identifier">T
</span><span class=
"special">(
</span><span class=
"number">2</span><span class=
"special">)
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
322 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"identifier">init2
</span> <span class=
"special">(
</span> <span class=
"identifier">init
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
323 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"identifier">init2
</span> <span class=
"special">==
</span> <span class=
"identifier">init
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
328 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
330 <div class=
"blockquote"><blockquote class=
"blockquote"><p>
331 <code class=
"computeroutput"><span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">&>::
</span><span class=
"identifier">optional
</span><span class=
"special">(
</span> <span class=
"identifier">optional
</span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"identifier">rhs
</span> <span class=
"special">);
</span></code>
332 </p></blockquote></div>
333 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
334 <li class=
"listitem">
335 <span class=
"bold"><strong>Effect:
</strong></span> Copy-Constructs an
<code class=
"computeroutput"><span class=
"identifier">optional
</span></code>.
337 <li class=
"listitem">
338 <span class=
"bold"><strong>Postconditions:
</strong></span> If
<code class=
"computeroutput"><span class=
"identifier">rhs
</span></code>
339 is initialized,
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code>
340 is initialized and its value is another reference to the same object referenced
341 by
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"identifier">rhs
</span></code>;
342 else
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code>
345 <li class=
"listitem">
346 <span class=
"bold"><strong>Throws:
</strong></span> Nothing.
348 <li class=
"listitem">
349 <span class=
"bold"><strong>Notes:
</strong></span> If
<code class=
"computeroutput"><span class=
"identifier">rhs
</span></code>
350 is initialized, both
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code>
351 and
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"identifier">rhs
</span></code>
352 will reefer to the same object (they alias).
354 <li class=
"listitem">
355 <span class=
"bold"><strong>Example:
</strong></span>
356 <pre class=
"programlisting"><span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">&></span> <span class=
"identifier">uninit
</span> <span class=
"special">;
</span>
357 <span class=
"identifier">assert
</span> <span class=
"special">(!
</span><span class=
"identifier">uninit
</span><span class=
"special">);
</span>
359 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">&></span> <span class=
"identifier">uinit2
</span> <span class=
"special">(
</span> <span class=
"identifier">uninit
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
360 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"identifier">uninit2
</span> <span class=
"special">==
</span> <span class=
"identifier">uninit
</span> <span class=
"special">);
</span>
362 <span class=
"identifier">T
</span> <span class=
"identifier">v
</span> <span class=
"special">=
</span> <span class=
"number">2</span> <span class=
"special">;
</span> <span class=
"identifier">T
</span><span class=
"special">&</span> <span class=
"identifier">ref
</span> <span class=
"special">=
</span> <span class=
"identifier">v
</span> <span class=
"special">;
</span>
363 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"identifier">init
</span><span class=
"special">(
</span><span class=
"identifier">ref
</span><span class=
"special">);
</span>
364 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"special">*
</span><span class=
"identifier">init
</span> <span class=
"special">==
</span> <span class=
"identifier">v
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
366 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"identifier">init2
</span> <span class=
"special">(
</span> <span class=
"identifier">init
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
367 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"special">*
</span><span class=
"identifier">init2
</span> <span class=
"special">==
</span> <span class=
"identifier">v
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
369 <span class=
"identifier">v
</span> <span class=
"special">=
</span> <span class=
"number">3</span> <span class=
"special">;
</span>
371 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"special">*
</span><span class=
"identifier">init
</span> <span class=
"special">==
</span> <span class=
"number">3</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
372 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"special">*
</span><span class=
"identifier">init2
</span> <span class=
"special">==
</span> <span class=
"number">3</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
377 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
379 <a name=
"reference_optional_move_constructor_optional"></a><div class=
"blockquote"><blockquote class=
"blockquote"><p>
380 <code class=
"computeroutput"><span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span> </code><span class=
"emphasis"><em>(not a ref)
</em></span><code class=
"computeroutput"><span class=
"special">>::
</span><span class=
"identifier">optional
</span><span class=
"special">(
</span> <span class=
"identifier">optional
</span><span class=
"special">&&</span> <span class=
"identifier">rhs
</span>
381 <span class=
"special">)
</span> <span class=
"keyword">noexcept
</span><span class=
"special">(
</span></code><span class=
"emphasis"><em>see below
</em></span><code class=
"computeroutput"><span class=
"special">);
</span></code>
382 </p></blockquote></div>
383 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
384 <li class=
"listitem">
385 <span class=
"bold"><strong>Requires:
</strong></span> <code class=
"computeroutput"><span class=
"identifier">is_move_constructible
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">>::
</span><span class=
"identifier">value
</span></code>
386 is
<code class=
"computeroutput"><span class=
"keyword">true
</span></code>.
388 <li class=
"listitem">
389 <span class=
"bold"><strong>Effect:
</strong></span> Move-constructs an
<code class=
"computeroutput"><span class=
"identifier">optional
</span></code>.
391 <li class=
"listitem">
392 <span class=
"bold"><strong>Postconditions:
</strong></span> If
<code class=
"computeroutput"><span class=
"identifier">rhs
</span></code>
393 is initialized,
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code>
394 is initialized and its value is move constructed from
<code class=
"computeroutput"><span class=
"identifier">rhs
</span></code>;
395 else
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code>
398 <li class=
"listitem">
399 <span class=
"bold"><strong>Throws:
</strong></span> Whatever
<code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">::
</span><span class=
"identifier">T
</span><span class=
"special">(
</span>
400 <span class=
"identifier">T
</span><span class=
"special">&&</span>
401 <span class=
"special">)
</span></code> throws.
403 <li class=
"listitem">
404 <span class=
"bold"><strong>Notes:
</strong></span> If
<code class=
"computeroutput"><span class=
"identifier">rhs
</span></code>
405 is initialized,
<code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">::
</span><span class=
"identifier">T
</span><span class=
"special">(
</span> <span class=
"identifier">T
</span>
406 <span class=
"special">&&</span> <span class=
"special">)
</span></code>
407 is called. The expression inside
<code class=
"computeroutput"><span class=
"keyword">noexcept
</span></code>
408 is equivalent to
<code class=
"computeroutput"><span class=
"identifier">is_nothrow_move_constructible
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">>::
</span><span class=
"identifier">value
</span></code>.
410 <li class=
"listitem">
411 <span class=
"bold"><strong>Exception Safety:
</strong></span> Exceptions can only
412 be thrown during
<code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">::
</span><span class=
"identifier">T
</span><span class=
"special">(
</span> <span class=
"identifier">T
</span><span class=
"special">&&</span> <span class=
"special">);
</span></code>
413 in that case,
<code class=
"computeroutput"><span class=
"identifier">rhs
</span></code> remains
414 initialized and the value of
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"identifier">rhs
</span></code> is determined by exception safety
415 of
<code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">::
</span><span class=
"identifier">T
</span><span class=
"special">(
</span><span class=
"identifier">T
</span><span class=
"special">&&)
</span></code>.
417 <li class=
"listitem">
418 <span class=
"bold"><strong>Example:
</strong></span>
419 <pre class=
"programlisting"><span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">unique_ptr
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">>></span> <span class=
"identifier">uninit
</span> <span class=
"special">;
</span>
420 <span class=
"identifier">assert
</span> <span class=
"special">(!
</span><span class=
"identifier">uninit
</span><span class=
"special">);
</span>
422 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">unique_ptr
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">>></span> <span class=
"identifier">uinit2
</span> <span class=
"special">(
</span> <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">move
</span><span class=
"special">(
</span><span class=
"identifier">uninit
</span><span class=
"special">)
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
423 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"identifier">uninit2
</span> <span class=
"special">==
</span> <span class=
"identifier">uninit
</span> <span class=
"special">);
</span>
425 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">unique_ptr
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">>></span> <span class=
"identifier">init
</span><span class=
"special">(
</span> <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">uniqye_ptr
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">>(
</span><span class=
"keyword">new
</span> <span class=
"identifier">T
</span><span class=
"special">(
</span><span class=
"number">2</span><span class=
"special">))
</span> <span class=
"special">);
</span>
426 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"special">**
</span><span class=
"identifier">init
</span> <span class=
"special">==
</span> <span class=
"identifier">T
</span><span class=
"special">(
</span><span class=
"number">2</span><span class=
"special">)
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
428 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">unique_ptr
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">>></span> <span class=
"identifier">init2
</span> <span class=
"special">(
</span> <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">move
</span><span class=
"special">(
</span><span class=
"identifier">init
</span><span class=
"special">)
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
429 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"identifier">init
</span> <span class=
"special">);
</span>
430 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"special">*
</span><span class=
"identifier">init
</span> <span class=
"special">==
</span> <span class=
"keyword">nullptr
</span> <span class=
"special">);
</span>
431 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"identifier">init2
</span> <span class=
"special">);
</span>
432 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"special">**
</span><span class=
"identifier">init2
</span> <span class=
"special">==
</span> <span class=
"identifier">T
</span><span class=
"special">(
</span><span class=
"number">2</span><span class=
"special">)
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
437 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
439 <div class=
"blockquote"><blockquote class=
"blockquote"><p>
440 <code class=
"computeroutput"><span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">&>::
</span><span class=
"identifier">optional
</span><span class=
"special">(
</span> <span class=
"identifier">optional
</span> <span class=
"special">&&</span>
441 <span class=
"identifier">rhs
</span> <span class=
"special">);
</span></code>
442 </p></blockquote></div>
443 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
444 <li class=
"listitem">
445 <span class=
"bold"><strong>Effect:
</strong></span> Move-Constructs an
<code class=
"computeroutput"><span class=
"identifier">optional
</span></code>.
447 <li class=
"listitem">
448 <span class=
"bold"><strong>Postconditions:
</strong></span> If
<code class=
"computeroutput"><span class=
"identifier">rhs
</span></code>
449 is initialized,
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code>
450 is initialized and its value is another reference to the same object referenced
451 by
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"identifier">rhs
</span></code>;
452 else
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code>
455 <li class=
"listitem">
456 <span class=
"bold"><strong>Throws:
</strong></span> Nothing.
458 <li class=
"listitem">
459 <span class=
"bold"><strong>Notes:
</strong></span> If
<code class=
"computeroutput"><span class=
"identifier">rhs
</span></code>
460 is initialized, both
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code>
461 and
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"identifier">rhs
</span></code>
462 will reefer to the same object (they alias).
464 <li class=
"listitem">
465 <span class=
"bold"><strong>Example:
</strong></span>
466 <pre class=
"programlisting"><span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">unique_ptr
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">>&></span> <span class=
"identifier">uninit
</span> <span class=
"special">;
</span>
467 <span class=
"identifier">assert
</span> <span class=
"special">(!
</span><span class=
"identifier">uninit
</span><span class=
"special">);
</span>
469 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">unique_ptr
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">>&></span> <span class=
"identifier">uinit2
</span> <span class=
"special">(
</span> <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">move
</span><span class=
"special">(
</span><span class=
"identifier">uninit
</span><span class=
"special">)
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
470 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"identifier">uninit2
</span> <span class=
"special">==
</span> <span class=
"identifier">uninit
</span> <span class=
"special">);
</span>
472 <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">unique_ptr
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"identifier">v
</span><span class=
"special">(
</span><span class=
"keyword">new
</span> <span class=
"identifier">T
</span><span class=
"special">(
</span><span class=
"number">2</span><span class=
"special">))
</span> <span class=
"special">;
</span>
473 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">unique_ptr
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">>&></span> <span class=
"identifier">init
</span><span class=
"special">(
</span><span class=
"identifier">v
</span><span class=
"special">);
</span>
474 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"special">*
</span><span class=
"identifier">init
</span> <span class=
"special">==
</span> <span class=
"identifier">v
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
476 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">unique_ptr
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">>&></span> <span class=
"identifier">init2
</span> <span class=
"special">(
</span> <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">move
</span><span class=
"special">(
</span><span class=
"identifier">init
</span><span class=
"special">)
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
477 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"special">*
</span><span class=
"identifier">init2
</span> <span class=
"special">==
</span> <span class=
"identifier">v
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
479 <span class=
"special">*
</span><span class=
"identifier">v
</span> <span class=
"special">=
</span> <span class=
"number">3</span> <span class=
"special">;
</span>
481 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"special">**
</span><span class=
"identifier">init
</span> <span class=
"special">==
</span> <span class=
"number">3</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
482 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"special">**
</span><span class=
"identifier">init2
</span> <span class=
"special">==
</span> <span class=
"number">3</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
487 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
489 <a name=
"reference_optional_constructor_other_optional"></a><div class=
"blockquote"><blockquote class=
"blockquote"><p>
490 <code class=
"computeroutput"><span class=
"keyword">template
</span><span class=
"special"><</span><span class=
"identifier">U
</span><span class=
"special">></span> <span class=
"keyword">explicit
</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span></code>
491 <span class=
"emphasis"><em>(not a ref)
</em></span><code class=
"computeroutput"><span class=
"special">>::
</span><span class=
"identifier">optional
</span><span class=
"special">(
</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">U
</span><span class=
"special">></span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"identifier">rhs
</span> <span class=
"special">);
</span></code>
492 </p></blockquote></div>
493 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
494 <li class=
"listitem">
495 <span class=
"bold"><strong>Effect:
</strong></span> Copy-Constructs an
<code class=
"computeroutput"><span class=
"identifier">optional
</span></code>.
497 <li class=
"listitem">
498 <span class=
"bold"><strong>Postconditions:
</strong></span> If
<code class=
"computeroutput"><span class=
"identifier">rhs
</span></code>
499 is initialized,
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code>
500 is initialized and its value is a
<span class=
"emphasis"><em>copy
</em></span> of the value
501 of rhs converted to type
<code class=
"computeroutput"><span class=
"identifier">T
</span></code>;
502 else
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code>
505 <li class=
"listitem">
506 <span class=
"bold"><strong>Throws:
</strong></span> Whatever
<code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">::
</span><span class=
"identifier">T
</span><span class=
"special">(
</span>
507 <span class=
"identifier">U
</span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"special">)
</span></code>
510 <li class=
"listitem">
511 <span class=
"bold"><strong>Notes:
</strong></span> <code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">::
</span><span class=
"identifier">T
</span><span class=
"special">(
</span>
512 <span class=
"identifier">U
</span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"special">)
</span></code>
513 is called if
<code class=
"computeroutput"><span class=
"identifier">rhs
</span></code> is initialized,
514 which requires a valid conversion from
<code class=
"computeroutput"><span class=
"identifier">U
</span></code>
515 to
<code class=
"computeroutput"><span class=
"identifier">T
</span></code>.
517 <li class=
"listitem">
518 <span class=
"bold"><strong>Exception Safety:
</strong></span> Exceptions can only
519 be thrown during
<code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">::
</span><span class=
"identifier">T
</span><span class=
"special">(
</span> <span class=
"identifier">U
</span>
520 <span class=
"keyword">const
</span><span class=
"special">&</span>
521 <span class=
"special">);
</span></code> in that case, this constructor
524 <li class=
"listitem">
525 <span class=
"bold"><strong>Example:
</strong></span>
526 <pre class=
"programlisting"><span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"keyword">double
</span><span class=
"special">></span> <span class=
"identifier">x
</span><span class=
"special">(
</span><span class=
"number">123.4</span><span class=
"special">);
</span>
527 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"special">*
</span><span class=
"identifier">x
</span> <span class=
"special">==
</span> <span class=
"number">123.4</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
529 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"keyword">int
</span><span class=
"special">></span> <span class=
"identifier">y
</span><span class=
"special">(
</span><span class=
"identifier">x
</span><span class=
"special">)
</span> <span class=
"special">;
</span>
530 <span class=
"identifier">assert
</span><span class=
"special">(
</span> <span class=
"special">*
</span><span class=
"identifier">y
</span> <span class=
"special">==
</span> <span class=
"number">123</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
535 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
537 <a name=
"reference_optional_move_constructor_other_optional"></a><div class=
"blockquote"><blockquote class=
"blockquote"><p>
538 <code class=
"computeroutput"><span class=
"keyword">template
</span><span class=
"special"><</span><span class=
"identifier">U
</span><span class=
"special">></span> <span class=
"keyword">explicit
</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span></code>
539 <span class=
"emphasis"><em>(not a ref)
</em></span><code class=
"computeroutput"><span class=
"special">>::
</span><span class=
"identifier">optional
</span><span class=
"special">(
</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">U
</span><span class=
"special">>&&</span>
540 <span class=
"identifier">rhs
</span> <span class=
"special">);
</span></code>
541 </p></blockquote></div>
542 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
543 <li class=
"listitem">
544 <span class=
"bold"><strong>Effect:
</strong></span> Move-constructs an
<code class=
"computeroutput"><span class=
"identifier">optional
</span></code>.
546 <li class=
"listitem">
547 <span class=
"bold"><strong>Postconditions:
</strong></span> If
<code class=
"computeroutput"><span class=
"identifier">rhs
</span></code>
548 is initialized,
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code>
549 is initialized and its value is move constructed from
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"identifier">rhs
</span></code>; else
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is uninitialized.
551 <li class=
"listitem">
552 <span class=
"bold"><strong>Throws:
</strong></span> Whatever
<code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">::
</span><span class=
"identifier">T
</span><span class=
"special">(
</span>
553 <span class=
"identifier">U
</span><span class=
"special">&&</span>
554 <span class=
"special">)
</span></code> throws.
556 <li class=
"listitem">
557 <span class=
"bold"><strong>Notes:
</strong></span> <code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">::
</span><span class=
"identifier">T
</span><span class=
"special">(
</span>
558 <span class=
"identifier">U
</span><span class=
"special">&&</span>
559 <span class=
"special">)
</span></code> is called if
<code class=
"computeroutput"><span class=
"identifier">rhs
</span></code>
560 is initialized, which requires a valid conversion from
<code class=
"computeroutput"><span class=
"identifier">U
</span></code>
561 to
<code class=
"computeroutput"><span class=
"identifier">T
</span></code>.
563 <li class=
"listitem">
564 <span class=
"bold"><strong>Exception Safety:
</strong></span> Exceptions can only
565 be thrown during
<code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">::
</span><span class=
"identifier">T
</span><span class=
"special">(
</span> <span class=
"identifier">U
</span><span class=
"special">&&</span> <span class=
"special">);
</span></code>
566 in that case,
<code class=
"computeroutput"><span class=
"identifier">rhs
</span></code> remains
567 initialized and the value of
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"identifier">rhs
</span></code> is determined by exception safety
568 guarantee of
<code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">::
</span><span class=
"identifier">T
</span><span class=
"special">(
</span> <span class=
"identifier">U
</span><span class=
"special">&&</span> <span class=
"special">)
</span></code>.
570 <li class=
"listitem">
571 <span class=
"bold"><strong>Example:
</strong></span>
572 <pre class=
"programlisting"><span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"keyword">double
</span><span class=
"special">></span> <span class=
"identifier">x
</span><span class=
"special">(
</span><span class=
"number">123.4</span><span class=
"special">);
</span>
573 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"special">*
</span><span class=
"identifier">x
</span> <span class=
"special">==
</span> <span class=
"number">123.4</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
575 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"keyword">int
</span><span class=
"special">></span> <span class=
"identifier">y
</span><span class=
"special">(
</span><span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">move
</span><span class=
"special">(
</span><span class=
"identifier">x
</span><span class=
"special">))
</span> <span class=
"special">;
</span>
576 <span class=
"identifier">assert
</span><span class=
"special">(
</span> <span class=
"special">*
</span><span class=
"identifier">y
</span> <span class=
"special">==
</span> <span class=
"number">123</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
581 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
583 <a name=
"reference_optional_constructor_factory"></a><div class=
"blockquote"><blockquote class=
"blockquote"><p>
584 <code class=
"computeroutput"><span class=
"keyword">template
</span><span class=
"special"><</span><span class=
"identifier">InPlaceFactory
</span><span class=
"special">></span>
585 <span class=
"keyword">explicit
</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span></code>
586 <span class=
"emphasis"><em>(not a ref)
</em></span><code class=
"computeroutput"><span class=
"special">>::
</span><span class=
"identifier">optional
</span><span class=
"special">(
</span> <span class=
"identifier">InPlaceFactory
</span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"identifier">f
</span> <span class=
"special">);
</span></code>
587 </p></blockquote></div>
588 <div class=
"blockquote"><blockquote class=
"blockquote"><p>
589 <code class=
"computeroutput"><span class=
"keyword">template
</span><span class=
"special"><</span><span class=
"identifier">TypedInPlaceFactory
</span><span class=
"special">></span>
590 <span class=
"keyword">explicit
</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span></code>
591 <span class=
"emphasis"><em>(not a ref)
</em></span><code class=
"computeroutput"><span class=
"special">>::
</span><span class=
"identifier">optional
</span><span class=
"special">(
</span> <span class=
"identifier">TypedInPlaceFactory
</span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"identifier">f
</span> <span class=
"special">);
</span></code>
592 </p></blockquote></div>
593 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
594 <li class=
"listitem">
595 <span class=
"bold"><strong>Effect:
</strong></span> Constructs an
<code class=
"computeroutput"><span class=
"identifier">optional
</span></code>
596 with a value of
<code class=
"computeroutput"><span class=
"identifier">T
</span></code> obtained
599 <li class=
"listitem">
600 <span class=
"bold"><strong>Postconditions:
</strong></span> <code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is
<span class=
"underline">initialized
</span>
601 and its value is
<span class=
"emphasis"><em>directly given
</em></span> from the factory
602 <code class=
"computeroutput"><span class=
"identifier">f
</span></code> (i.e., the value
<span class=
"underline">is not copied
</span>).
604 <li class=
"listitem">
605 <span class=
"bold"><strong>Throws:
</strong></span> Whatever the
<code class=
"computeroutput"><span class=
"identifier">T
</span></code>
606 constructor called by the factory throws.
608 <li class=
"listitem">
609 <span class=
"bold"><strong>Notes:
</strong></span> See
<a class=
"link" href=
"tutorial/in_place_factories.html" title=
"In-Place Factories">In-Place
612 <li class=
"listitem">
613 <span class=
"bold"><strong>Exception Safety:
</strong></span> Exceptions can only
614 be thrown during the call to the
<code class=
"computeroutput"><span class=
"identifier">T
</span></code>
615 constructor used by the factory; in that case, this constructor has no
618 <li class=
"listitem">
619 <span class=
"bold"><strong>Example:
</strong></span>
620 <pre class=
"programlisting"><span class=
"keyword">class
</span> <span class=
"identifier">C
</span> <span class=
"special">{
</span> <span class=
"identifier">C
</span> <span class=
"special">(
</span> <span class=
"keyword">char
</span><span class=
"special">,
</span> <span class=
"keyword">double
</span><span class=
"special">,
</span> <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">string
</span> <span class=
"special">)
</span> <span class=
"special">;
</span> <span class=
"special">}
</span> <span class=
"special">;
</span>
622 <span class=
"identifier">C
</span> <span class=
"identifier">v
</span><span class=
"special">(
</span><span class=
"char">'A'
</span><span class=
"special">,
</span><span class=
"number">123.4</span><span class=
"special">,
</span><span class=
"string">"hello"</span><span class=
"special">);
</span>
624 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">C
</span><span class=
"special">></span> <span class=
"identifier">x
</span><span class=
"special">(
</span> <span class=
"identifier">in_place
</span> <span class=
"special">(
</span><span class=
"char">'A'
</span><span class=
"special">,
</span> <span class=
"number">123.4</span><span class=
"special">,
</span> <span class=
"string">"hello"</span><span class=
"special">)
</span> <span class=
"special">);
</span> <span class=
"comment">// InPlaceFactory used
</span>
625 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">C
</span><span class=
"special">></span> <span class=
"identifier">y
</span><span class=
"special">(
</span> <span class=
"identifier">in_place
</span><span class=
"special"><</span><span class=
"identifier">C
</span><span class=
"special">>(
</span><span class=
"char">'A'
</span><span class=
"special">,
</span> <span class=
"number">123.4</span><span class=
"special">,
</span> <span class=
"string">"hello"</span><span class=
"special">)
</span> <span class=
"special">);
</span> <span class=
"comment">// TypedInPlaceFactory used
</span>
627 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"special">*
</span><span class=
"identifier">x
</span> <span class=
"special">==
</span> <span class=
"identifier">v
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
628 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"special">*
</span><span class=
"identifier">y
</span> <span class=
"special">==
</span> <span class=
"identifier">v
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
633 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
635 <a name=
"reference_optional_operator_equal_none_t"></a><div class=
"blockquote"><blockquote class=
"blockquote"><p>
636 <code class=
"computeroutput"><span class=
"identifier">optional
</span><span class=
"special">&</span>
637 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">>::
</span><span class=
"keyword">operator
</span><span class=
"special">=
</span> <span class=
"special">(
</span> <span class=
"identifier">none_t
</span> <span class=
"special">)
</span> <span class=
"keyword">noexcept
</span><span class=
"special">;
</span></code>
638 </p></blockquote></div>
639 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
640 <li class=
"listitem">
641 <span class=
"bold"><strong>Effect:
</strong></span> If
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is initialized destroys its contained
644 <li class=
"listitem">
645 <span class=
"bold"><strong>Postconditions:
</strong></span> <code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is uninitialized.
649 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
651 <a name=
"reference_optional_operator_equal_value"></a><div class=
"blockquote"><blockquote class=
"blockquote"><p>
652 <code class=
"computeroutput"><span class=
"identifier">optional
</span><span class=
"special">&</span>
653 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span></code> <span class=
"emphasis"><em>(not a ref)
</em></span><code class=
"computeroutput"><span class=
"special">>::
</span><span class=
"keyword">operator
</span><span class=
"special">=
</span> <span class=
"special">(
</span> <span class=
"identifier">T
</span>
654 <span class=
"keyword">const
</span><span class=
"special">&</span>
655 <span class=
"identifier">rhs
</span> <span class=
"special">)
</span>
656 <span class=
"special">;
</span></code>
657 </p></blockquote></div>
658 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
659 <li class=
"listitem">
660 <span class=
"bold"><strong>Effect:
</strong></span> Assigns the value
<code class=
"computeroutput"><span class=
"identifier">rhs
</span></code> to an
<code class=
"computeroutput"><span class=
"identifier">optional
</span></code>.
662 <li class=
"listitem">
663 <span class=
"bold"><strong>Postconditions:
</strong></span> <code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is initialized and its value is a
664 <span class=
"emphasis"><em>copy
</em></span> of
<code class=
"computeroutput"><span class=
"identifier">rhs
</span></code>.
666 <li class=
"listitem">
667 <span class=
"bold"><strong>Throws:
</strong></span> Whatever
<code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">::
</span><span class=
"keyword">operator
</span><span class=
"special">=(
</span> <span class=
"identifier">T
</span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"special">)
</span></code> or
<code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">::
</span><span class=
"identifier">T
</span><span class=
"special">(
</span><span class=
"identifier">T
</span> <span class=
"keyword">const
</span><span class=
"special">&)
</span></code> throws.
669 <li class=
"listitem">
670 <span class=
"bold"><strong>Notes:
</strong></span> If
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> was initialized,
<code class=
"computeroutput"><span class=
"identifier">T
</span></code>'s
671 assignment operator is used, otherwise, its copy-constructor is used.
673 <li class=
"listitem">
674 <span class=
"bold"><strong>Exception Safety:
</strong></span> In the event of an exception,
675 the initialization state of
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is unchanged and its value unspecified
676 as far as
<code class=
"computeroutput"><span class=
"identifier">optional
</span></code> is concerned
677 (it is up to
<code class=
"computeroutput"><span class=
"identifier">T
</span></code>'s
<code class=
"computeroutput"><span class=
"keyword">operator
</span><span class=
"special">=()
</span></code>).
678 If
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code>
679 is initially uninitialized and
<code class=
"computeroutput"><span class=
"identifier">T
</span></code>'s
680 <span class=
"emphasis"><em>copy constructor
</em></span> fails,
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is left properly uninitialized.
682 <li class=
"listitem">
683 <span class=
"bold"><strong>Example:
</strong></span>
684 <pre class=
"programlisting"><span class=
"identifier">T
</span> <span class=
"identifier">x
</span><span class=
"special">;
</span>
685 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"identifier">def
</span> <span class=
"special">;
</span>
686 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"identifier">opt
</span><span class=
"special">(
</span><span class=
"identifier">x
</span><span class=
"special">)
</span> <span class=
"special">;
</span>
688 <span class=
"identifier">T
</span> <span class=
"identifier">y
</span><span class=
"special">;
</span>
689 <span class=
"identifier">def
</span> <span class=
"special">=
</span> <span class=
"identifier">y
</span> <span class=
"special">;
</span>
690 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"special">*
</span><span class=
"identifier">def
</span> <span class=
"special">==
</span> <span class=
"identifier">y
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
691 <span class=
"identifier">opt
</span> <span class=
"special">=
</span> <span class=
"identifier">y
</span> <span class=
"special">;
</span>
692 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"special">*
</span><span class=
"identifier">opt
</span> <span class=
"special">==
</span> <span class=
"identifier">y
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
697 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
699 <div class=
"blockquote"><blockquote class=
"blockquote"><p>
700 <code class=
"computeroutput"><span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">&>&</span>
701 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">&>::
</span><span class=
"keyword">operator
</span><span class=
"special">=
</span> <span class=
"special">(
</span> <span class=
"identifier">T
</span><span class=
"special">&</span>
702 <span class=
"identifier">rhs
</span> <span class=
"special">)
</span>
703 <span class=
"special">;
</span></code>
704 </p></blockquote></div>
705 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
706 <li class=
"listitem">
707 <span class=
"bold"><strong>Effect:
</strong></span> (Re)binds the wrapped reference.
709 <li class=
"listitem">
710 <span class=
"bold"><strong>Postconditions:
</strong></span> <code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is initialized and it references the
711 same object referenced by
<code class=
"computeroutput"><span class=
"identifier">rhs
</span></code>.
713 <li class=
"listitem">
714 <span class=
"bold"><strong>Notes:
</strong></span> If
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> was initialized, it is
<span class=
"emphasis"><em>rebound
</em></span>
715 to the new object. See
<a class=
"link" href=
"tutorial/rebinding_semantics_for_assignment_of_optional_references.html" title=
"Rebinding semantics for assignment of optional references">here
</a>
716 for details on this behavior.
718 <li class=
"listitem">
719 <span class=
"bold"><strong>Example:
</strong></span>
720 <pre class=
"programlisting"><span class=
"keyword">int
</span> <span class=
"identifier">a
</span> <span class=
"special">=
</span> <span class=
"number">1</span> <span class=
"special">;
</span>
721 <span class=
"keyword">int
</span> <span class=
"identifier">b
</span> <span class=
"special">=
</span> <span class=
"number">2</span> <span class=
"special">;
</span>
722 <span class=
"identifier">T
</span><span class=
"special">&</span> <span class=
"identifier">ra
</span> <span class=
"special">=
</span> <span class=
"identifier">a
</span> <span class=
"special">;
</span>
723 <span class=
"identifier">T
</span><span class=
"special">&</span> <span class=
"identifier">rb
</span> <span class=
"special">=
</span> <span class=
"identifier">b
</span> <span class=
"special">;
</span>
724 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"keyword">int
</span><span class=
"special">&></span> <span class=
"identifier">def
</span> <span class=
"special">;
</span>
725 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"keyword">int
</span><span class=
"special">&></span> <span class=
"identifier">opt
</span><span class=
"special">(
</span><span class=
"identifier">ra
</span><span class=
"special">)
</span> <span class=
"special">;
</span>
727 <span class=
"identifier">def
</span> <span class=
"special">=
</span> <span class=
"identifier">rb
</span> <span class=
"special">;
</span> <span class=
"comment">// binds 'def' to 'b' through 'rb'
</span>
728 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"special">*
</span><span class=
"identifier">def
</span> <span class=
"special">==
</span> <span class=
"identifier">b
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
729 <span class=
"special">*
</span><span class=
"identifier">def
</span> <span class=
"special">=
</span> <span class=
"identifier">a
</span> <span class=
"special">;
</span> <span class=
"comment">// changes the value of 'b' to a copy of the value of 'a'
</span>
730 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"identifier">b
</span> <span class=
"special">==
</span> <span class=
"identifier">a
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
731 <span class=
"keyword">int
</span> <span class=
"identifier">c
</span> <span class=
"special">=
</span> <span class=
"number">3</span><span class=
"special">;
</span>
732 <span class=
"keyword">int
</span><span class=
"special">&</span> <span class=
"identifier">rc
</span> <span class=
"special">=
</span> <span class=
"identifier">c
</span> <span class=
"special">;
</span>
733 <span class=
"identifier">opt
</span> <span class=
"special">=
</span> <span class=
"identifier">rc
</span> <span class=
"special">;
</span> <span class=
"comment">// REBINDS to 'c' through 'rc'
</span>
734 <span class=
"identifier">c
</span> <span class=
"special">=
</span> <span class=
"number">4</span> <span class=
"special">;
</span>
735 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"special">*
</span><span class=
"identifier">opt
</span> <span class=
"special">==
</span> <span class=
"number">4</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
740 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
742 <a name=
"reference_optional_operator_move_equal_value"></a><div class=
"blockquote"><blockquote class=
"blockquote"><p>
743 <code class=
"computeroutput"><span class=
"identifier">optional
</span><span class=
"special">&</span>
744 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span></code> <span class=
"emphasis"><em>(not a ref)
</em></span><code class=
"computeroutput"><span class=
"special">>::
</span><span class=
"keyword">operator
</span><span class=
"special">=
</span> <span class=
"special">(
</span> <span class=
"identifier">T
</span><span class=
"special">&&</span> <span class=
"identifier">rhs
</span>
745 <span class=
"special">)
</span> <span class=
"special">;
</span></code>
746 </p></blockquote></div>
747 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
748 <li class=
"listitem">
749 <span class=
"bold"><strong>Effect:
</strong></span> Moves the value
<code class=
"computeroutput"><span class=
"identifier">rhs
</span></code> to an
<code class=
"computeroutput"><span class=
"identifier">optional
</span></code>.
751 <li class=
"listitem">
752 <span class=
"bold"><strong>Postconditions:
</strong></span> <code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is initialized and its value is moved
753 from
<code class=
"computeroutput"><span class=
"identifier">rhs
</span></code>.
755 <li class=
"listitem">
756 <span class=
"bold"><strong>Throws:
</strong></span> Whatever
<code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">::
</span><span class=
"keyword">operator
</span><span class=
"special">=(
</span> <span class=
"identifier">T
</span><span class=
"special">&&</span> <span class=
"special">)
</span></code>
757 or
<code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">::
</span><span class=
"identifier">T
</span><span class=
"special">(
</span><span class=
"identifier">T
</span>
758 <span class=
"special">&&)
</span></code> throws.
760 <li class=
"listitem">
761 <span class=
"bold"><strong>Notes:
</strong></span> If
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> was initialized,
<code class=
"computeroutput"><span class=
"identifier">T
</span></code>'s
762 move-assignment operator is used, otherwise, its move-constructor is used.
764 <li class=
"listitem">
765 <span class=
"bold"><strong>Exception Safety:
</strong></span> In the event of an exception,
766 the initialization state of
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is unchanged and its value unspecified
767 as far as
<code class=
"computeroutput"><span class=
"identifier">optional
</span></code> is concerned
768 (it is up to
<code class=
"computeroutput"><span class=
"identifier">T
</span></code>'s
<code class=
"computeroutput"><span class=
"keyword">operator
</span><span class=
"special">=()
</span></code>).
769 If
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code>
770 is initially uninitialized and
<code class=
"computeroutput"><span class=
"identifier">T
</span></code>'s
771 <span class=
"emphasis"><em>move constructor
</em></span> fails,
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is left properly uninitialized.
773 <li class=
"listitem">
774 <span class=
"bold"><strong>Example:
</strong></span>
775 <pre class=
"programlisting"><span class=
"identifier">T
</span> <span class=
"identifier">x
</span><span class=
"special">;
</span>
776 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"identifier">def
</span> <span class=
"special">;
</span>
777 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"identifier">opt
</span><span class=
"special">(
</span><span class=
"identifier">x
</span><span class=
"special">)
</span> <span class=
"special">;
</span>
779 <span class=
"identifier">T
</span> <span class=
"identifier">y1
</span><span class=
"special">,
</span> <span class=
"identifier">y2
</span><span class=
"special">,
</span> <span class=
"identifier">yR
</span><span class=
"special">;
</span>
780 <span class=
"identifier">def
</span> <span class=
"special">=
</span> <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">move
</span><span class=
"special">(
</span><span class=
"identifier">y1
</span><span class=
"special">)
</span> <span class=
"special">;
</span>
781 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"special">*
</span><span class=
"identifier">def
</span> <span class=
"special">==
</span> <span class=
"identifier">yR
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
782 <span class=
"identifier">opt
</span> <span class=
"special">=
</span> <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">move
</span><span class=
"special">(
</span><span class=
"identifier">y2
</span><span class=
"special">)
</span> <span class=
"special">;
</span>
783 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"special">*
</span><span class=
"identifier">opt
</span> <span class=
"special">==
</span> <span class=
"identifier">yR
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
788 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
790 <div class=
"blockquote"><blockquote class=
"blockquote"><p>
791 <code class=
"computeroutput"><span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">&>&</span>
792 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">&>::
</span><span class=
"keyword">operator
</span><span class=
"special">=
</span> <span class=
"special">(
</span> <span class=
"identifier">T
</span><span class=
"special">&&</span>
793 <span class=
"identifier">rhs
</span> <span class=
"special">)
</span>
794 <span class=
"special">=
</span> <span class=
"keyword">delete
</span><span class=
"special">;
</span></code>
795 </p></blockquote></div>
796 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; "><li class=
"listitem">
797 <span class=
"bold"><strong>Notes:
</strong></span> This assignment operator is deleted.
800 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
802 <a name=
"reference_optional_operator_equal_optional"></a><div class=
"blockquote"><blockquote class=
"blockquote"><p>
803 <code class=
"computeroutput"><span class=
"identifier">optional
</span><span class=
"special">&</span>
804 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span></code> <span class=
"emphasis"><em>(not a ref)
</em></span><code class=
"computeroutput"><span class=
"special">>::
</span><span class=
"keyword">operator
</span><span class=
"special">=
</span> <span class=
"special">(
</span> <span class=
"identifier">optional
</span>
805 <span class=
"keyword">const
</span><span class=
"special">&</span>
806 <span class=
"identifier">rhs
</span> <span class=
"special">)
</span>
807 <span class=
"special">;
</span></code>
808 </p></blockquote></div>
809 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
810 <li class=
"listitem">
811 <span class=
"bold"><strong>Effect:
</strong></span> Assigns another
<code class=
"computeroutput"><span class=
"identifier">optional
</span></code> to an
<code class=
"computeroutput"><span class=
"identifier">optional
</span></code>.
813 <li class=
"listitem">
814 <span class=
"bold"><strong>Postconditions:
</strong></span> If
<code class=
"computeroutput"><span class=
"identifier">rhs
</span></code>
815 is initialized,
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code>
816 is initialized and its value is a
<span class=
"emphasis"><em>copy
</em></span> of the value
817 of
<code class=
"computeroutput"><span class=
"identifier">rhs
</span></code>; else
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is
820 <li class=
"listitem">
821 <span class=
"bold"><strong>Throws:
</strong></span> Whatever
<code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">::
</span><span class=
"keyword">operator
</span><span class=
"special">(
</span> <span class=
"identifier">T
</span> <span class=
"keyword">const
</span><span class=
"special">&)
</span></code>
822 or
<code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">::
</span><span class=
"identifier">T
</span><span class=
"special">(
</span> <span class=
"identifier">T
</span>
823 <span class=
"keyword">const
</span><span class=
"special">&</span>
824 <span class=
"special">)
</span></code> throws.
826 <li class=
"listitem">
827 <span class=
"bold"><strong>Notes:
</strong></span> If both
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> and
<code class=
"computeroutput"><span class=
"identifier">rhs
</span></code>
828 are initially initialized,
<code class=
"computeroutput"><span class=
"identifier">T
</span></code>'s
829 <span class=
"emphasis"><em>assignment operator
</em></span> is used. If
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is initially initialized but
<code class=
"computeroutput"><span class=
"identifier">rhs
</span></code> is uninitialized,
<code class=
"computeroutput"><span class=
"identifier">T
</span></code>'s
830 [destructor] is called. If
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is initially uninitialized but
<code class=
"computeroutput"><span class=
"identifier">rhs
</span></code> is initialized,
<code class=
"computeroutput"><span class=
"identifier">T
</span></code>'s
831 <span class=
"emphasis"><em>copy constructor
</em></span> is called.
833 <li class=
"listitem">
834 <span class=
"bold"><strong>Exception Safety:
</strong></span> In the event of an exception,
835 the initialization state of
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is unchanged and its value unspecified
836 as far as optional is concerned (it is up to
<code class=
"computeroutput"><span class=
"identifier">T
</span></code>'s
837 <code class=
"computeroutput"><span class=
"keyword">operator
</span><span class=
"special">=()
</span></code>).
838 If
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code>
839 is initially uninitialized and
<code class=
"computeroutput"><span class=
"identifier">T
</span></code>'s
840 <span class=
"emphasis"><em>copy constructor
</em></span> fails,
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is left properly uninitialized.
842 <li class=
"listitem">
843 <span class=
"bold"><strong>Example:
</strong></span>
844 <pre class=
"programlisting"><span class=
"identifier">T
</span> <span class=
"identifier">v
</span><span class=
"special">;
</span>
845 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"identifier">opt
</span><span class=
"special">(
</span><span class=
"identifier">v
</span><span class=
"special">);
</span>
846 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"identifier">def
</span> <span class=
"special">;
</span>
848 <span class=
"identifier">opt
</span> <span class=
"special">=
</span> <span class=
"identifier">def
</span> <span class=
"special">;
</span>
849 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"special">!
</span><span class=
"identifier">def
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
850 <span class=
"comment">// previous value (copy of 'v') destroyed from within 'opt'.
</span>
855 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
857 <div class=
"blockquote"><blockquote class=
"blockquote"><p>
858 <code class=
"computeroutput"><span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">&></span> <span class=
"special">&</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">&>::
</span><span class=
"keyword">operator
</span><span class=
"special">=
</span> <span class=
"special">(
</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">&></span>
859 <span class=
"keyword">const
</span><span class=
"special">&</span>
860 <span class=
"identifier">rhs
</span> <span class=
"special">)
</span>
861 <span class=
"special">;
</span></code>
862 </p></blockquote></div>
863 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
864 <li class=
"listitem">
865 <span class=
"bold"><strong>Effect:
</strong></span> (Re)binds thee wrapped reference.
867 <li class=
"listitem">
868 <span class=
"bold"><strong>Postconditions:
</strong></span> If
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"identifier">rhs
</span></code> is initialized,
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is initialized and it references the
869 same object referenced by
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"identifier">rhs
</span></code>; otherwise,
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is uninitialized (and references no
872 <li class=
"listitem">
873 <span class=
"bold"><strong>Notes:
</strong></span> If
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> was initialized and so is
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"identifier">rhs
</span></code>,
874 <code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code>
875 is
<span class=
"emphasis"><em>rebound
</em></span> to the new object. See
<a class=
"link" href=
"tutorial/rebinding_semantics_for_assignment_of_optional_references.html" title=
"Rebinding semantics for assignment of optional references">here
</a>
876 for details on this behavior.
878 <li class=
"listitem">
879 <span class=
"bold"><strong>Example:
</strong></span>
880 <pre class=
"programlisting"><span class=
"keyword">int
</span> <span class=
"identifier">a
</span> <span class=
"special">=
</span> <span class=
"number">1</span> <span class=
"special">;
</span>
881 <span class=
"keyword">int
</span> <span class=
"identifier">b
</span> <span class=
"special">=
</span> <span class=
"number">2</span> <span class=
"special">;
</span>
882 <span class=
"identifier">T
</span><span class=
"special">&</span> <span class=
"identifier">ra
</span> <span class=
"special">=
</span> <span class=
"identifier">a
</span> <span class=
"special">;
</span>
883 <span class=
"identifier">T
</span><span class=
"special">&</span> <span class=
"identifier">rb
</span> <span class=
"special">=
</span> <span class=
"identifier">b
</span> <span class=
"special">;
</span>
884 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"keyword">int
</span><span class=
"special">&></span> <span class=
"identifier">def
</span> <span class=
"special">;
</span>
885 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"keyword">int
</span><span class=
"special">&></span> <span class=
"identifier">ora
</span><span class=
"special">(
</span><span class=
"identifier">ra
</span><span class=
"special">)
</span> <span class=
"special">;
</span>
886 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"keyword">int
</span><span class=
"special">&></span> <span class=
"identifier">orb
</span><span class=
"special">(
</span><span class=
"identifier">rb
</span><span class=
"special">)
</span> <span class=
"special">;
</span>
888 <span class=
"identifier">def
</span> <span class=
"special">=
</span> <span class=
"identifier">orb
</span> <span class=
"special">;
</span> <span class=
"comment">// binds 'def' to 'b' through 'rb' wrapped within 'orb'
</span>
889 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"special">*
</span><span class=
"identifier">def
</span> <span class=
"special">==
</span> <span class=
"identifier">b
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
890 <span class=
"special">*
</span><span class=
"identifier">def
</span> <span class=
"special">=
</span> <span class=
"identifier">ora
</span> <span class=
"special">;
</span> <span class=
"comment">// changes the value of 'b' to a copy of the value of 'a'
</span>
891 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"identifier">b
</span> <span class=
"special">==
</span> <span class=
"identifier">a
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
892 <span class=
"keyword">int
</span> <span class=
"identifier">c
</span> <span class=
"special">=
</span> <span class=
"number">3</span><span class=
"special">;
</span>
893 <span class=
"keyword">int
</span><span class=
"special">&</span> <span class=
"identifier">rc
</span> <span class=
"special">=
</span> <span class=
"identifier">c
</span> <span class=
"special">;
</span>
894 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"keyword">int
</span><span class=
"special">&></span> <span class=
"identifier">orc
</span><span class=
"special">(
</span><span class=
"identifier">rc
</span><span class=
"special">)
</span> <span class=
"special">;
</span>
895 <span class=
"identifier">ora
</span> <span class=
"special">=
</span> <span class=
"identifier">orc
</span> <span class=
"special">;
</span> <span class=
"comment">// REBINDS ora to 'c' through 'rc'
</span>
896 <span class=
"identifier">c
</span> <span class=
"special">=
</span> <span class=
"number">4</span> <span class=
"special">;
</span>
897 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"special">*
</span><span class=
"identifier">ora
</span> <span class=
"special">==
</span> <span class=
"number">4</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
902 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
904 <a name=
"reference_optional_operator_move_equal_optional"></a><div class=
"blockquote"><blockquote class=
"blockquote"><p>
905 <code class=
"computeroutput"><span class=
"identifier">optional
</span><span class=
"special">&</span>
906 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span></code> <span class=
"emphasis"><em>(not a ref)
</em></span><code class=
"computeroutput"><span class=
"special">>::
</span><span class=
"keyword">operator
</span><span class=
"special">=
</span> <span class=
"special">(
</span> <span class=
"identifier">optional
</span><span class=
"special">&&</span> <span class=
"identifier">rhs
</span>
907 <span class=
"special">)
</span> <span class=
"keyword">noexcept
</span><span class=
"special">(
</span></code><span class=
"emphasis"><em>see below
</em></span><code class=
"computeroutput"><span class=
"special">);
</span></code>
908 </p></blockquote></div>
909 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
910 <li class=
"listitem">
911 <span class=
"bold"><strong>Effect:
</strong></span> Move-assigns another
<code class=
"computeroutput"><span class=
"identifier">optional
</span></code> to an
<code class=
"computeroutput"><span class=
"identifier">optional
</span></code>.
913 <li class=
"listitem">
914 <span class=
"bold"><strong>Postconditions:
</strong></span> If
<code class=
"computeroutput"><span class=
"identifier">rhs
</span></code>
915 is initialized,
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code>
916 is initialized and its value is moved from
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"identifier">rhs
</span></code>,
<code class=
"computeroutput"><span class=
"identifier">rhs
</span></code>
917 remains initialized; else
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is uninitialized.
919 <li class=
"listitem">
920 <span class=
"bold"><strong>Throws:
</strong></span> Whatever
<code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">::
</span><span class=
"keyword">operator
</span><span class=
"special">(
</span> <span class=
"identifier">T
</span><span class=
"special">&&</span>
921 <span class=
"special">)
</span></code> or
<code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">::
</span><span class=
"identifier">T
</span><span class=
"special">(
</span>
922 <span class=
"identifier">T
</span> <span class=
"special">&&</span>
923 <span class=
"special">)
</span></code> throws.
925 <li class=
"listitem">
926 <span class=
"bold"><strong>Notes:
</strong></span> If both
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> and
<code class=
"computeroutput"><span class=
"identifier">rhs
</span></code>
927 are initially initialized,
<code class=
"computeroutput"><span class=
"identifier">T
</span></code>'s
928 <span class=
"emphasis"><em>move assignment operator
</em></span> is used. If
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is
929 initially initialized but
<code class=
"computeroutput"><span class=
"identifier">rhs
</span></code>
930 is uninitialized,
<code class=
"computeroutput"><span class=
"identifier">T
</span></code>'s [destructor]
931 is called. If
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code>
932 is initially uninitialized but
<code class=
"computeroutput"><span class=
"identifier">rhs
</span></code>
933 is initialized,
<code class=
"computeroutput"><span class=
"identifier">T
</span></code>'s
<span class=
"emphasis"><em>move
934 constructor
</em></span> is called. The expression inside
<code class=
"computeroutput"><span class=
"keyword">noexcept
</span></code>
935 is equivalent to
<code class=
"computeroutput"><span class=
"identifier">is_nothrow_move_constructible
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">>::
</span><span class=
"identifier">value
</span>
936 <span class=
"special">&&</span> <span class=
"identifier">is_nothrow_move_assignable
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">>::
</span><span class=
"identifier">value
</span></code>.
938 <li class=
"listitem">
939 <span class=
"bold"><strong>Exception Safety:
</strong></span> In the event of an exception,
940 the initialization state of
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is unchanged and its value unspecified
941 as far as optional is concerned (it is up to
<code class=
"computeroutput"><span class=
"identifier">T
</span></code>'s
942 <code class=
"computeroutput"><span class=
"keyword">operator
</span><span class=
"special">=()
</span></code>).
943 If
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code>
944 is initially uninitialized and
<code class=
"computeroutput"><span class=
"identifier">T
</span></code>'s
945 <span class=
"emphasis"><em>move constructor
</em></span> fails,
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is left properly uninitialized.
947 <li class=
"listitem">
948 <span class=
"bold"><strong>Example:
</strong></span>
949 <pre class=
"programlisting"><span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"identifier">opt
</span><span class=
"special">(
</span><span class=
"identifier">T
</span><span class=
"special">(
</span><span class=
"number">2</span><span class=
"special">))
</span> <span class=
"special">;
</span>
950 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"identifier">def
</span> <span class=
"special">;
</span>
952 <span class=
"identifier">opt
</span> <span class=
"special">=
</span> <span class=
"identifier">def
</span> <span class=
"special">;
</span>
953 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"identifier">def
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
954 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"identifier">opt
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
955 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"special">*
</span><span class=
"identifier">opt
</span> <span class=
"special">==
</span> <span class=
"identifier">T
</span><span class=
"special">(
</span><span class=
"number">2</span><span class=
"special">)
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
960 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
962 <div class=
"blockquote"><blockquote class=
"blockquote"><p>
963 <code class=
"computeroutput"><span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">&></span> <span class=
"special">&</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">&>::
</span><span class=
"keyword">operator
</span><span class=
"special">=
</span> <span class=
"special">(
</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">&>&&</span>
964 <span class=
"identifier">rhs
</span> <span class=
"special">)
</span>
965 <span class=
"special">;
</span></code>
966 </p></blockquote></div>
967 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; "><li class=
"listitem">
968 <span class=
"bold"><strong>Effect:
</strong></span> Same as
<code class=
"computeroutput"><span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">&>::
</span><span class=
"keyword">operator
</span><span class=
"special">=
</span> <span class=
"special">(
</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">&></span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"identifier">rhs
</span> <span class=
"special">)
</span></code>.
971 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
973 <a name=
"reference_optional_operator_equal_other_optional"></a><div class=
"blockquote"><blockquote class=
"blockquote"><p>
974 <code class=
"computeroutput"><span class=
"keyword">template
</span><span class=
"special"><</span><span class=
"identifier">U
</span><span class=
"special">></span> <span class=
"identifier">optional
</span><span class=
"special">&</span>
975 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span></code> <span class=
"emphasis"><em>(not a ref)
</em></span><code class=
"computeroutput"><span class=
"special">>::
</span><span class=
"keyword">operator
</span><span class=
"special">=
</span> <span class=
"special">(
</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">U
</span><span class=
"special">></span>
976 <span class=
"keyword">const
</span><span class=
"special">&</span>
977 <span class=
"identifier">rhs
</span> <span class=
"special">)
</span>
978 <span class=
"special">;
</span></code>
979 </p></blockquote></div>
980 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
981 <li class=
"listitem">
982 <span class=
"bold"><strong>Effect:
</strong></span> Assigns another convertible optional
985 <li class=
"listitem">
986 <span class=
"bold"><strong>Postconditions:
</strong></span> If
<code class=
"computeroutput"><span class=
"identifier">rhs
</span></code>
987 is initialized,
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code>
988 is initialized and its value is a
<span class=
"emphasis"><em>copy
</em></span> of the value
989 of
<code class=
"computeroutput"><span class=
"identifier">rhs
</span></code> <span class=
"emphasis"><em>converted
</em></span>
990 to type
<code class=
"computeroutput"><span class=
"identifier">T
</span></code>; else
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is
993 <li class=
"listitem">
994 <span class=
"bold"><strong>Throws:
</strong></span> Whatever
<code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">::
</span><span class=
"keyword">operator
</span><span class=
"special">=(
</span> <span class=
"identifier">U
</span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"special">)
</span></code> or
<code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">::
</span><span class=
"identifier">T
</span><span class=
"special">(
</span>
995 <span class=
"identifier">U
</span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"special">)
</span></code>
998 <li class=
"listitem">
999 <span class=
"bold"><strong>Notes:
</strong></span> If both
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> and rhs are initially initialized,
1000 <code class=
"computeroutput"><span class=
"identifier">T
</span></code>'s
<span class=
"emphasis"><em>assignment
1001 operator
</em></span> (from
<code class=
"computeroutput"><span class=
"identifier">U
</span></code>)
1002 is used. If
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code>
1003 is initially initialized but
<code class=
"computeroutput"><span class=
"identifier">rhs
</span></code>
1004 is uninitialized,
<code class=
"computeroutput"><span class=
"identifier">T
</span></code>'s
1005 <span class=
"emphasis"><em>destructor
</em></span> is called. If
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is initially uninitialized but rhs
1006 is initialized,
<code class=
"computeroutput"><span class=
"identifier">T
</span></code>'s
<span class=
"emphasis"><em>converting
1007 constructor
</em></span> (from
<code class=
"computeroutput"><span class=
"identifier">U
</span></code>)
1010 <li class=
"listitem">
1011 <span class=
"bold"><strong>Exception Safety:
</strong></span> In the event of an exception,
1012 the initialization state of
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is unchanged and its value unspecified
1013 as far as optional is concerned (it is up to
<code class=
"computeroutput"><span class=
"identifier">T
</span></code>'s
1014 <code class=
"computeroutput"><span class=
"keyword">operator
</span><span class=
"special">=()
</span></code>).
1015 If
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code>
1016 is initially uninitialized and
<code class=
"computeroutput"><span class=
"identifier">T
</span></code>'s
1017 converting constructor fails,
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is left properly uninitialized.
1019 <li class=
"listitem">
1020 <span class=
"bold"><strong>Example:
</strong></span>
1021 <pre class=
"programlisting"><span class=
"identifier">T
</span> <span class=
"identifier">v
</span><span class=
"special">;
</span>
1022 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"identifier">opt0
</span><span class=
"special">(
</span><span class=
"identifier">v
</span><span class=
"special">);
</span>
1023 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">U
</span><span class=
"special">></span> <span class=
"identifier">opt1
</span><span class=
"special">;
</span>
1025 <span class=
"identifier">opt1
</span> <span class=
"special">=
</span> <span class=
"identifier">opt0
</span> <span class=
"special">;
</span>
1026 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"special">*
</span><span class=
"identifier">opt1
</span> <span class=
"special">==
</span> <span class=
"keyword">static_cast
</span><span class=
"special"><</span><span class=
"identifier">U
</span><span class=
"special">>(
</span><span class=
"identifier">v
</span><span class=
"special">)
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
1031 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
1033 <a name=
"reference_optional_operator_move_equal_other_optional"></a><div class=
"blockquote"><blockquote class=
"blockquote"><p>
1034 <code class=
"computeroutput"><span class=
"keyword">template
</span><span class=
"special"><</span><span class=
"identifier">U
</span><span class=
"special">></span> <span class=
"identifier">optional
</span><span class=
"special">&</span>
1035 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span></code> <span class=
"emphasis"><em>(not a ref)
</em></span><code class=
"computeroutput"><span class=
"special">>::
</span><span class=
"keyword">operator
</span><span class=
"special">=
</span> <span class=
"special">(
</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">U
</span><span class=
"special">>&&</span>
1036 <span class=
"identifier">rhs
</span> <span class=
"special">)
</span>
1037 <span class=
"special">;
</span></code>
1038 </p></blockquote></div>
1039 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
1040 <li class=
"listitem">
1041 <span class=
"bold"><strong>Effect:
</strong></span> Move-assigns another convertible
1042 optional to an optional.
1044 <li class=
"listitem">
1045 <span class=
"bold"><strong>Postconditions:
</strong></span> If
<code class=
"computeroutput"><span class=
"identifier">rhs
</span></code>
1046 is initialized,
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code>
1047 is initialized and its value is moved from the value of
<code class=
"computeroutput"><span class=
"identifier">rhs
</span></code>;
1048 else
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code>
1051 <li class=
"listitem">
1052 <span class=
"bold"><strong>Throws:
</strong></span> Whatever
<code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">::
</span><span class=
"keyword">operator
</span><span class=
"special">=(
</span> <span class=
"identifier">U
</span><span class=
"special">&&</span> <span class=
"special">)
</span></code>
1053 or
<code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">::
</span><span class=
"identifier">T
</span><span class=
"special">(
</span> <span class=
"identifier">U
</span><span class=
"special">&&</span> <span class=
"special">)
</span></code>
1056 <li class=
"listitem">
1057 <span class=
"bold"><strong>Notes:
</strong></span> If both
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> and
<code class=
"computeroutput"><span class=
"identifier">rhs
</span></code>
1058 are initially initialized,
<code class=
"computeroutput"><span class=
"identifier">T
</span></code>'s
1059 <span class=
"emphasis"><em>assignment operator
</em></span> (from
<code class=
"computeroutput"><span class=
"identifier">U
</span><span class=
"special">&&</span></code>) is used. If
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is initially initialized but
<code class=
"computeroutput"><span class=
"identifier">rhs
</span></code> is uninitialized,
<code class=
"computeroutput"><span class=
"identifier">T
</span></code>'s
1060 <span class=
"emphasis"><em>destructor
</em></span> is called. If
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is initially uninitialized but
<code class=
"computeroutput"><span class=
"identifier">rhs
</span></code> is initialized,
<code class=
"computeroutput"><span class=
"identifier">T
</span></code>'s
1061 <span class=
"emphasis"><em>converting constructor
</em></span> (from
<code class=
"computeroutput"><span class=
"identifier">U
</span><span class=
"special">&&</span></code>) is called.
1063 <li class=
"listitem">
1064 <span class=
"bold"><strong>Exception Safety:
</strong></span> In the event of an exception,
1065 the initialization state of
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is unchanged and its value unspecified
1066 as far as optional is concerned (it is up to
<code class=
"computeroutput"><span class=
"identifier">T
</span></code>'s
1067 <code class=
"computeroutput"><span class=
"keyword">operator
</span><span class=
"special">=()
</span></code>).
1068 If
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code>
1069 is initially uninitialized and
<code class=
"computeroutput"><span class=
"identifier">T
</span></code>'s
1070 converting constructor fails,
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is left properly uninitialized.
1072 <li class=
"listitem">
1073 <span class=
"bold"><strong>Example:
</strong></span>
1074 <pre class=
"programlisting"><span class=
"identifier">T
</span> <span class=
"identifier">v
</span><span class=
"special">;
</span>
1075 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"identifier">opt0
</span><span class=
"special">(
</span><span class=
"identifier">v
</span><span class=
"special">);
</span>
1076 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">U
</span><span class=
"special">></span> <span class=
"identifier">opt1
</span><span class=
"special">;
</span>
1078 <span class=
"identifier">opt1
</span> <span class=
"special">=
</span> <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">move
</span><span class=
"special">(
</span><span class=
"identifier">opt0
</span><span class=
"special">)
</span> <span class=
"special">;
</span>
1079 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"special">*
</span><span class=
"identifier">opt1
</span> <span class=
"special">==
</span> <span class=
"keyword">static_cast
</span><span class=
"special"><</span><span class=
"identifier">U
</span><span class=
"special">>(
</span><span class=
"identifier">v
</span><span class=
"special">)
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
1084 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
1086 <a name=
"reference_optional_emplace"></a><div class=
"blockquote"><blockquote class=
"blockquote"><p>
1087 <code class=
"computeroutput"><span class=
"keyword">template
</span><span class=
"special"><</span><span class=
"keyword">class
</span><span class=
"special">...
</span> <span class=
"identifier">Args
</span><span class=
"special">></span> <span class=
"keyword">void
</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span></code>
1088 <span class=
"emphasis"><em>(not a ref)
</em></span><code class=
"computeroutput"><span class=
"special">>::
</span><span class=
"identifier">emplace
</span><span class=
"special">(
</span> <span class=
"identifier">Args
</span><span class=
"special">...
&&</span>
1089 <span class=
"identifier">args
</span> <span class=
"special">);
</span></code>
1090 </p></blockquote></div>
1091 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
1092 <li class=
"listitem">
1093 <span class=
"bold"><strong>Requires:
</strong></span> The compiler supports rvalue
1094 references and variadic templates.
1096 <li class=
"listitem">
1097 <span class=
"bold"><strong>Effect:
</strong></span> If
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is initialized calls
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span> <span class=
"special">=
</span>
1098 <span class=
"identifier">none
</span></code>. Then initializes in-place
1099 the contained value as if direct-initializing an object of type
<code class=
"computeroutput"><span class=
"identifier">T
</span></code> with
<code class=
"computeroutput"><span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">forward
</span><span class=
"special"><</span><span class=
"identifier">Args
</span><span class=
"special">>(
</span><span class=
"identifier">args
</span><span class=
"special">)...
</span></code>.
1101 <li class=
"listitem">
1102 <span class=
"bold"><strong>Postconditions:
</strong></span> <code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is
<span class=
"underline">initialized
</span>.
1104 <li class=
"listitem">
1105 <span class=
"bold"><strong>Throws:
</strong></span> Whatever the selected
<code class=
"computeroutput"><span class=
"identifier">T
</span></code>'s constructor throws.
1107 <li class=
"listitem">
1108 <span class=
"bold"><strong>Notes:
</strong></span> <code class=
"computeroutput"><span class=
"identifier">T
</span></code>
1109 need not be
<code class=
"computeroutput"><span class=
"identifier">MoveConstructible
</span></code>
1110 or
<code class=
"computeroutput"><span class=
"identifier">MoveAssignable
</span></code>.
1112 <li class=
"listitem">
1113 <span class=
"bold"><strong>Exception Safety:
</strong></span> If an exception is thrown
1114 during the initialization of
<code class=
"computeroutput"><span class=
"identifier">T
</span></code>,
1115 <code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code>
1116 is
<span class=
"emphasis"><em>uninitialized
</em></span>.
1120 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
1122 <a name=
"reference_optional_operator_equal_factory"></a><div class=
"blockquote"><blockquote class=
"blockquote"><p>
1123 <code class=
"computeroutput"><span class=
"keyword">template
</span><span class=
"special"><</span><span class=
"identifier">InPlaceFactory
</span><span class=
"special">></span>
1124 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">>&</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span></code> <span class=
"emphasis"><em>(not a ref)
</em></span><code class=
"computeroutput"><span class=
"special">>::
</span><span class=
"keyword">operator
</span><span class=
"special">=(
</span> <span class=
"identifier">InPlaceFactory
</span>
1125 <span class=
"keyword">const
</span><span class=
"special">&</span>
1126 <span class=
"identifier">f
</span> <span class=
"special">);
</span></code>
1127 </p></blockquote></div>
1128 <div class=
"blockquote"><blockquote class=
"blockquote"><p>
1129 <code class=
"computeroutput"><span class=
"keyword">template
</span><span class=
"special"><</span><span class=
"identifier">TypedInPlaceFactory
</span><span class=
"special">></span>
1130 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">>&</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span></code> <span class=
"emphasis"><em>(not a ref)
</em></span><code class=
"computeroutput"><span class=
"special">>::
</span><span class=
"keyword">operator
</span><span class=
"special">=(
</span> <span class=
"identifier">TypedInPlaceFactory
</span>
1131 <span class=
"keyword">const
</span><span class=
"special">&</span>
1132 <span class=
"identifier">f
</span> <span class=
"special">);
</span></code>
1133 </p></blockquote></div>
1134 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
1135 <li class=
"listitem">
1136 <span class=
"bold"><strong>Effect:
</strong></span> Assigns an
<code class=
"computeroutput"><span class=
"identifier">optional
</span></code>
1137 with a value of
<code class=
"computeroutput"><span class=
"identifier">T
</span></code> obtained
1140 <li class=
"listitem">
1141 <span class=
"bold"><strong>Postconditions:
</strong></span> <code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is
<span class=
"underline">initialized
</span>
1142 and its value is
<span class=
"emphasis"><em>directly given
</em></span> from the factory
1143 <code class=
"computeroutput"><span class=
"identifier">f
</span></code> (i.e., the value
<span class=
"underline">is not copied
</span>).
1145 <li class=
"listitem">
1146 <span class=
"bold"><strong>Throws:
</strong></span> Whatever the
<code class=
"computeroutput"><span class=
"identifier">T
</span></code>
1147 constructor called by the factory throws.
1149 <li class=
"listitem">
1150 <span class=
"bold"><strong>Notes:
</strong></span> See
<a class=
"link" href=
"tutorial/in_place_factories.html" title=
"In-Place Factories">In-Place
1153 <li class=
"listitem">
1154 <span class=
"bold"><strong>Exception Safety:
</strong></span> Exceptions can only
1155 be thrown during the call to the
<code class=
"computeroutput"><span class=
"identifier">T
</span></code>
1156 constructor used by the factory; in that case, the
<code class=
"computeroutput"><span class=
"identifier">optional
</span></code>
1157 object will be reset to be
<span class=
"emphasis"><em>uninitialized
</em></span>.
1161 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
1163 <a name=
"reference_optional_reset_value"></a><div class=
"blockquote"><blockquote class=
"blockquote"><p>
1164 <code class=
"computeroutput"><span class=
"keyword">void
</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span></code>
1165 <span class=
"emphasis"><em>(not a ref)
</em></span><code class=
"computeroutput"><span class=
"special">>::
</span><span class=
"identifier">reset
</span><span class=
"special">(
</span> <span class=
"identifier">T
</span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"identifier">v
</span> <span class=
"special">)
</span> <span class=
"special">;
</span></code>
1166 </p></blockquote></div>
1167 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; "><li class=
"listitem">
1168 <span class=
"bold"><strong>Deprecated:
</strong></span> same as
<code class=
"computeroutput"><span class=
"keyword">operator
</span><span class=
"special">=
</span> <span class=
"special">(
</span> <span class=
"identifier">T
</span>
1169 <span class=
"keyword">const
</span><span class=
"special">&</span>
1170 <span class=
"identifier">v
</span><span class=
"special">)
</span>
1171 <span class=
"special">;
</span></code>
1174 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
1176 <a name=
"reference_optional_reset"></a><div class=
"blockquote"><blockquote class=
"blockquote"><p>
1177 <code class=
"computeroutput"><span class=
"keyword">void
</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">>::
</span><span class=
"identifier">reset
</span><span class=
"special">()
</span> <span class=
"keyword">noexcept
</span> <span class=
"special">;
</span></code>
1178 </p></blockquote></div>
1179 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; "><li class=
"listitem">
1180 <span class=
"bold"><strong>Deprecated:
</strong></span> Same as
<code class=
"computeroutput"><span class=
"keyword">operator
</span><span class=
"special">=(
</span> <span class=
"identifier">none_t
</span> <span class=
"special">);
</span></code>
1183 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
1185 <a name=
"reference_optional_get"></a><div class=
"blockquote"><blockquote class=
"blockquote"><p>
1186 <code class=
"computeroutput"><span class=
"identifier">T
</span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span></code>
1187 <span class=
"emphasis"><em>(not a ref)
</em></span><code class=
"computeroutput"><span class=
"special">>::
</span><span class=
"identifier">get
</span><span class=
"special">()
</span> <span class=
"keyword">const
</span> <span class=
"special">;
</span></code>
1188 </p></blockquote></div>
1189 <div class=
"blockquote"><blockquote class=
"blockquote"><p>
1190 <code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">&</span>
1191 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span></code> <span class=
"emphasis"><em>(not a ref)
</em></span><code class=
"computeroutput"><span class=
"special">>::
</span><span class=
"identifier">get
</span><span class=
"special">()
</span> <span class=
"special">;
</span></code>
1192 </p></blockquote></div>
1193 <div class=
"blockquote"><blockquote class=
"blockquote"><p>
1194 <code class=
"computeroutput"><span class=
"keyword">inline
</span> <span class=
"identifier">T
</span>
1195 <span class=
"keyword">const
</span><span class=
"special">&</span>
1196 <span class=
"identifier">get
</span> <span class=
"special">(
</span>
1197 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span></code> <span class=
"emphasis"><em>(not a ref)
</em></span><code class=
"computeroutput"><span class=
"special">></span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"special">)
</span> <span class=
"special">;
</span></code>
1198 </p></blockquote></div>
1199 <div class=
"blockquote"><blockquote class=
"blockquote"><p>
1200 <code class=
"computeroutput"><span class=
"keyword">inline
</span> <span class=
"identifier">T
</span><span class=
"special">&</span> <span class=
"identifier">get
</span> <span class=
"special">(
</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span></code>
1201 <span class=
"emphasis"><em>(not a ref)
</em></span><code class=
"computeroutput"><span class=
"special">></span>
1202 <span class=
"special">&)
</span> <span class=
"special">;
</span></code>
1203 </p></blockquote></div>
1204 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
1205 <li class=
"listitem">
1206 <span class=
"bold"><strong>Requires:
</strong></span> <code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is initialized
1208 <li class=
"listitem">
1209 <span class=
"bold"><strong>Returns:
</strong></span> A reference to the contained
1212 <li class=
"listitem">
1213 <span class=
"bold"><strong>Throws:
</strong></span> Nothing.
1215 <li class=
"listitem">
1216 <span class=
"bold"><strong>Notes:
</strong></span> The requirement is asserted via
1217 <code class=
"computeroutput"><span class=
"identifier">BOOST_ASSERT
</span><span class=
"special">()
</span></code>.
1221 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
1223 <div class=
"blockquote"><blockquote class=
"blockquote"><p>
1224 <code class=
"computeroutput"><span class=
"identifier">T
</span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">&>::
</span><span class=
"identifier">get
</span><span class=
"special">()
</span> <span class=
"keyword">const
</span> <span class=
"special">;
</span></code>
1225 </p></blockquote></div>
1226 <div class=
"blockquote"><blockquote class=
"blockquote"><p>
1227 <code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">&</span>
1228 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">&>::
</span><span class=
"identifier">get
</span><span class=
"special">()
</span> <span class=
"special">;
</span></code>
1229 </p></blockquote></div>
1230 <div class=
"blockquote"><blockquote class=
"blockquote"><p>
1231 <code class=
"computeroutput"><span class=
"keyword">inline
</span> <span class=
"identifier">T
</span>
1232 <span class=
"keyword">const
</span><span class=
"special">&</span>
1233 <span class=
"identifier">get
</span> <span class=
"special">(
</span>
1234 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">&></span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"special">)
</span> <span class=
"special">;
</span></code>
1235 </p></blockquote></div>
1236 <div class=
"blockquote"><blockquote class=
"blockquote"><p>
1237 <code class=
"computeroutput"><span class=
"keyword">inline
</span> <span class=
"identifier">T
</span><span class=
"special">&</span> <span class=
"identifier">get
</span> <span class=
"special">(
</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">&></span>
1238 <span class=
"special">&)
</span> <span class=
"special">;
</span></code>
1239 </p></blockquote></div>
1240 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
1241 <li class=
"listitem">
1242 <span class=
"bold"><strong>Requires:
</strong></span> <code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is initialized
1244 <li class=
"listitem">
1245 <span class=
"bold"><strong>Returns:
</strong></span> <span class=
"underline">The
</span>
1246 reference contained.
1248 <li class=
"listitem">
1249 <span class=
"bold"><strong>Throws:
</strong></span> Nothing.
1251 <li class=
"listitem">
1252 <span class=
"bold"><strong>Notes:
</strong></span> The requirement is asserted via
1253 <code class=
"computeroutput"><span class=
"identifier">BOOST_ASSERT
</span><span class=
"special">()
</span></code>.
1257 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
1259 <a name=
"reference_optional_operator_asterisk"></a><div class=
"blockquote"><blockquote class=
"blockquote"><p>
1260 <code class=
"computeroutput"><span class=
"identifier">T
</span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span></code>
1261 <span class=
"emphasis"><em>(not a ref)
</em></span><code class=
"computeroutput"><span class=
"special">>::
</span><span class=
"keyword">operator
</span><span class=
"special">*()
</span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"special">;
</span></code>
1262 </p></blockquote></div>
1263 <div class=
"blockquote"><blockquote class=
"blockquote"><p>
1264 <code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">&</span>
1265 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span></code> <span class=
"emphasis"><em>(not a ref)
</em></span><code class=
"computeroutput"><span class=
"special">>::
</span><span class=
"keyword">operator
</span><span class=
"special">*()
</span> <span class=
"special">&;
</span></code>
1266 </p></blockquote></div>
1267 <div class=
"blockquote"><blockquote class=
"blockquote"><p>
1268 <code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">&&</span>
1269 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span></code> <span class=
"emphasis"><em>(not a ref)
</em></span><code class=
"computeroutput"><span class=
"special">>::
</span><span class=
"keyword">operator
</span><span class=
"special">*()
</span> <span class=
"special">&&;
</span></code>
1270 </p></blockquote></div>
1271 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
1272 <li class=
"listitem">
1273 <span class=
"bold"><strong>Requires:
</strong></span> <code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is initialized
1275 <li class=
"listitem">
1276 <span class=
"bold"><strong>Returns:
</strong></span> A reference to the contained
1279 <li class=
"listitem">
1280 <span class=
"bold"><strong>Throws:
</strong></span> Nothing.
1282 <li class=
"listitem">
1283 <span class=
"bold"><strong>Notes:
</strong></span> The requirement is asserted via
1284 <code class=
"computeroutput"><span class=
"identifier">BOOST_ASSERT
</span><span class=
"special">()
</span></code>.
1285 On compilers that do not support ref-qualifiers on member functions these
1286 three overloads are replaced with the classical two: a
<code class=
"computeroutput"><span class=
"keyword">const
</span></code>
1287 and non-
<code class=
"computeroutput"><span class=
"keyword">const
</span></code> member functions.
1289 <li class=
"listitem">
1290 <span class=
"bold"><strong>Example:
</strong></span>
1291 <pre class=
"programlisting"><span class=
"identifier">T
</span> <span class=
"identifier">v
</span> <span class=
"special">;
</span>
1292 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"identifier">opt
</span> <span class=
"special">(
</span> <span class=
"identifier">v
</span> <span class=
"special">);
</span>
1293 <span class=
"identifier">T
</span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"identifier">u
</span> <span class=
"special">=
</span> <span class=
"special">*
</span><span class=
"identifier">opt
</span><span class=
"special">;
</span>
1294 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"identifier">u
</span> <span class=
"special">==
</span> <span class=
"identifier">v
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
1295 <span class=
"identifier">T
</span> <span class=
"identifier">w
</span> <span class=
"special">;
</span>
1296 <span class=
"special">*
</span><span class=
"identifier">opt
</span> <span class=
"special">=
</span> <span class=
"identifier">w
</span> <span class=
"special">;
</span>
1297 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"special">*
</span><span class=
"identifier">opt
</span> <span class=
"special">==
</span> <span class=
"identifier">w
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
1302 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
1304 <div class=
"blockquote"><blockquote class=
"blockquote"><p>
1305 <code class=
"computeroutput"><span class=
"identifier">T
</span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">&>::
</span><span class=
"keyword">operator
</span><span class=
"special">*()
</span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"special">;
</span></code>
1306 </p></blockquote></div>
1307 <div class=
"blockquote"><blockquote class=
"blockquote"><p>
1308 <code class=
"computeroutput"><span class=
"identifier">T
</span> <span class=
"special">&</span>
1309 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">&>::
</span><span class=
"keyword">operator
</span><span class=
"special">*()
</span> <span class=
"special">&</span> <span class=
"special">;
</span></code>
1310 </p></blockquote></div>
1311 <div class=
"blockquote"><blockquote class=
"blockquote"><p>
1312 <code class=
"computeroutput"><span class=
"identifier">T
</span> <span class=
"special">&</span>
1313 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">&>::
</span><span class=
"keyword">operator
</span><span class=
"special">*()
</span> <span class=
"special">&&</span> <span class=
"special">;
</span></code>
1314 </p></blockquote></div>
1315 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
1316 <li class=
"listitem">
1317 <span class=
"bold"><strong>Requires:
</strong></span> <code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is initialized
1319 <li class=
"listitem">
1320 <span class=
"bold"><strong>Returns:
</strong></span> <span class=
"underline">The
</span>
1321 reference contained.
1323 <li class=
"listitem">
1324 <span class=
"bold"><strong>Throws:
</strong></span> Nothing.
1326 <li class=
"listitem">
1327 <span class=
"bold"><strong>Notes:
</strong></span> The requirement is asserted via
1328 <code class=
"computeroutput"><span class=
"identifier">BOOST_ASSERT
</span><span class=
"special">()
</span></code>.
1329 On compilers that do not support ref-qualifiers on member functions these
1330 three overloads are replaced with the classical two: a
<code class=
"computeroutput"><span class=
"keyword">const
</span></code>
1331 and non-
<code class=
"computeroutput"><span class=
"keyword">const
</span></code> member functions.
1333 <li class=
"listitem">
1334 <span class=
"bold"><strong>Example:
</strong></span>
1335 <pre class=
"programlisting"><span class=
"identifier">T
</span> <span class=
"identifier">v
</span> <span class=
"special">;
</span>
1336 <span class=
"identifier">T
</span><span class=
"special">&</span> <span class=
"identifier">vref
</span> <span class=
"special">=
</span> <span class=
"identifier">v
</span> <span class=
"special">;
</span>
1337 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">&></span> <span class=
"identifier">opt
</span> <span class=
"special">(
</span> <span class=
"identifier">vref
</span> <span class=
"special">);
</span>
1338 <span class=
"identifier">T
</span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"identifier">vref2
</span> <span class=
"special">=
</span> <span class=
"special">*
</span><span class=
"identifier">opt
</span><span class=
"special">;
</span>
1339 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"identifier">vref2
</span> <span class=
"special">==
</span> <span class=
"identifier">v
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
1340 <span class=
"special">++
</span> <span class=
"identifier">v
</span> <span class=
"special">;
</span>
1341 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"special">*
</span><span class=
"identifier">opt
</span> <span class=
"special">==
</span> <span class=
"identifier">v
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
1346 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
1348 <a name=
"reference_optional_value"></a><div class=
"blockquote"><blockquote class=
"blockquote"><p>
1349 <code class=
"computeroutput"><span class=
"identifier">T
</span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">>::
</span><span class=
"identifier">value
</span><span class=
"special">()
</span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"special">;
</span></code>
1350 </p></blockquote></div>
1351 <div class=
"blockquote"><blockquote class=
"blockquote"><p>
1352 <code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">&</span>
1353 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">>::
</span><span class=
"identifier">value
</span><span class=
"special">()
</span> <span class=
"special">&</span> <span class=
"special">;
</span></code>
1354 </p></blockquote></div>
1355 <div class=
"blockquote"><blockquote class=
"blockquote"><p>
1356 <code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">&&</span>
1357 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">>::
</span><span class=
"identifier">value
</span><span class=
"special">()
</span> <span class=
"special">&&</span> <span class=
"special">;
</span></code>
1358 </p></blockquote></div>
1359 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
1360 <li class=
"listitem">
1361 <span class=
"bold"><strong>Returns:
</strong></span> A reference to the contained
1362 value, if
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code>
1365 <li class=
"listitem">
1366 <span class=
"bold"><strong>Throws:
</strong></span> An instance of
<code class=
"computeroutput"><span class=
"identifier">bad_optional_access
</span></code>,
1367 if
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code>
1370 <li class=
"listitem">
1371 <span class=
"bold"><strong>Notes:
</strong></span> On compilers that do not support
1372 ref-qualifiers on member functions these three overloads are replaced with
1373 the classical two: a
<code class=
"computeroutput"><span class=
"keyword">const
</span></code>
1374 and non-
<code class=
"computeroutput"><span class=
"keyword">const
</span></code> member functions.
1376 <li class=
"listitem">
1377 <span class=
"bold"><strong>Example:
</strong></span>
1378 <pre class=
"programlisting"><span class=
"identifier">T
</span> <span class=
"identifier">v
</span> <span class=
"special">;
</span>
1379 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"identifier">o0
</span><span class=
"special">,
</span> <span class=
"identifier">o1
</span> <span class=
"special">(
</span> <span class=
"identifier">v
</span> <span class=
"special">);
</span>
1380 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"identifier">o1
</span><span class=
"special">.
</span><span class=
"identifier">value
</span><span class=
"special">()
</span> <span class=
"special">==
</span> <span class=
"identifier">v
</span> <span class=
"special">);
</span>
1382 <span class=
"keyword">try
</span> <span class=
"special">{
</span>
1383 <span class=
"identifier">o0
</span><span class=
"special">.
</span><span class=
"identifier">value
</span><span class=
"special">();
</span> <span class=
"comment">// throws
</span>
1384 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"keyword">false
</span> <span class=
"special">);
</span>
1385 <span class=
"special">}
</span>
1386 <span class=
"keyword">catch
</span><span class=
"special">(
</span><span class=
"identifier">bad_optional_access
</span><span class=
"special">&)
</span> <span class=
"special">{
</span>
1387 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"keyword">true
</span> <span class=
"special">);
</span>
1388 <span class=
"special">}
</span>
1390 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
1393 <a name=
"reference_optional_value_or"></a><div class=
"blockquote"><blockquote class=
"blockquote"><p>
1394 <code class=
"computeroutput"><span class=
"keyword">template
</span><span class=
"special"><</span><span class=
"keyword">class
</span> <span class=
"identifier">U
</span><span class=
"special">></span> <span class=
"identifier">T
</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">>::
</span><span class=
"identifier">value_or
</span><span class=
"special">(
</span><span class=
"identifier">U
</span> <span class=
"special">&&</span>
1395 <span class=
"identifier">v
</span><span class=
"special">)
</span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"special">;
</span></code>
1396 </p></blockquote></div>
1397 <div class=
"blockquote"><blockquote class=
"blockquote"><p>
1398 <code class=
"computeroutput"><span class=
"keyword">template
</span><span class=
"special"><</span><span class=
"keyword">class
</span> <span class=
"identifier">U
</span><span class=
"special">></span> <span class=
"identifier">T
</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">>::
</span><span class=
"identifier">value_or
</span><span class=
"special">(
</span><span class=
"identifier">U
</span> <span class=
"special">&&</span>
1399 <span class=
"identifier">v
</span><span class=
"special">)
</span> <span class=
"special">&&</span> <span class=
"special">;
</span></code>
1400 </p></blockquote></div>
1401 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
1402 <li class=
"listitem">
1403 <span class=
"bold"><strong>Requires:
</strong></span> <code class=
"computeroutput"><span class=
"identifier">T
</span></code>
1404 is CopyConstructible.
1406 <li class=
"listitem">
1407 <span class=
"bold"><strong>Returns:
</strong></span> First overload:
<code class=
"computeroutput"><span class=
"keyword">bool
</span><span class=
"special">(*
</span><span class=
"keyword">this
</span><span class=
"special">)
</span> <span class=
"special">?
</span> <span class=
"special">**
</span><span class=
"keyword">this
</span> <span class=
"special">:
</span> <span class=
"keyword">static_cast
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">>(
</span><span class=
"identifier">forward
</span><span class=
"special"><</span><span class=
"identifier">U
</span><span class=
"special">>(
</span><span class=
"identifier">v
</span><span class=
"special">))
</span></code>.
1408 second overload:
<code class=
"computeroutput"><span class=
"keyword">bool
</span><span class=
"special">(*
</span><span class=
"keyword">this
</span><span class=
"special">)
</span> <span class=
"special">?
</span>
1409 <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">move
</span><span class=
"special">(**
</span><span class=
"keyword">this
</span><span class=
"special">)
</span> <span class=
"special">:
</span>
1410 <span class=
"keyword">static_cast
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">>(
</span><span class=
"identifier">forward
</span><span class=
"special"><</span><span class=
"identifier">U
</span><span class=
"special">>(
</span><span class=
"identifier">v
</span><span class=
"special">))
</span></code>.
1412 <li class=
"listitem">
1413 <span class=
"bold"><strong>Throws:
</strong></span> Any exception thrown by the selected
1414 constructor of
<code class=
"computeroutput"><span class=
"identifier">T
</span></code>.
1416 <li class=
"listitem">
1417 <span class=
"bold"><strong>Notes:
</strong></span> On compilers that do not support
1418 ref-qualifiers on member functions these three overloads are replaced with
1419 the classical two: a
<code class=
"computeroutput"><span class=
"keyword">const
</span></code>
1420 and non-
<code class=
"computeroutput"><span class=
"keyword">const
</span></code> member functions.
1421 On compilers without rvalue reference support the type of
<code class=
"computeroutput"><span class=
"identifier">v
</span></code> becomes
<code class=
"computeroutput"><span class=
"identifier">U
</span>
1422 <span class=
"keyword">const
</span><span class=
"special">&</span></code>.
1426 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
1428 <a name=
"reference_optional_get_value_or_value"></a><div class=
"blockquote"><blockquote class=
"blockquote"><p>
1429 <code class=
"computeroutput"><span class=
"identifier">T
</span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span></code>
1430 <span class=
"emphasis"><em>(not a ref)
</em></span><code class=
"computeroutput"><span class=
"special">>::
</span><span class=
"identifier">get_value_or
</span><span class=
"special">(
</span>
1431 <span class=
"identifier">T
</span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"keyword">default
</span><span class=
"special">)
</span> <span class=
"keyword">const
</span> <span class=
"special">;
</span></code>
1432 </p></blockquote></div>
1433 <div class=
"blockquote"><blockquote class=
"blockquote"><p>
1434 <code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">&</span>
1435 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span></code> <span class=
"emphasis"><em>(not a ref)
</em></span><code class=
"computeroutput"><span class=
"special">>::
</span><span class=
"identifier">get_value_or
</span><span class=
"special">(
</span> <span class=
"identifier">T
</span><span class=
"special">&</span>
1436 <span class=
"keyword">default
</span> <span class=
"special">)
</span>
1437 <span class=
"special">;
</span></code>
1438 </p></blockquote></div>
1439 <div class=
"blockquote"><blockquote class=
"blockquote"><p>
1440 <code class=
"computeroutput"><span class=
"keyword">inline
</span> <span class=
"identifier">T
</span>
1441 <span class=
"keyword">const
</span><span class=
"special">&</span>
1442 <span class=
"identifier">get_optional_value_or
</span> <span class=
"special">(
</span>
1443 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span></code> <span class=
"emphasis"><em>(not a ref)
</em></span><code class=
"computeroutput"><span class=
"special">></span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"identifier">o
</span><span class=
"special">,
</span> <span class=
"identifier">T
</span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"keyword">default
</span> <span class=
"special">)
</span> <span class=
"special">;
</span></code>
1444 </p></blockquote></div>
1445 <div class=
"blockquote"><blockquote class=
"blockquote"><p>
1446 <code class=
"computeroutput"><span class=
"keyword">inline
</span> <span class=
"identifier">T
</span><span class=
"special">&</span> <span class=
"identifier">get_optional_value_or
</span>
1447 <span class=
"special">(
</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span></code>
1448 <span class=
"emphasis"><em>(not a ref)
</em></span><code class=
"computeroutput"><span class=
"special">>&</span>
1449 <span class=
"identifier">o
</span><span class=
"special">,
</span> <span class=
"identifier">T
</span><span class=
"special">&</span> <span class=
"keyword">default
</span> <span class=
"special">)
</span> <span class=
"special">;
</span></code>
1450 </p></blockquote></div>
1451 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
1452 <li class=
"listitem">
1453 <span class=
"bold"><strong>Deprecated:
</strong></span> Use
<code class=
"computeroutput"><span class=
"identifier">value_or
</span><span class=
"special">()
</span></code> instead.
1455 <li class=
"listitem">
1456 <span class=
"bold"><strong>Returns:
</strong></span> A reference to the contained
1457 value, if any, or
<code class=
"computeroutput"><span class=
"keyword">default
</span></code>.
1459 <li class=
"listitem">
1460 <span class=
"bold"><strong>Throws:
</strong></span> Nothing.
1462 <li class=
"listitem">
1463 <span class=
"bold"><strong>Example:
</strong></span>
1464 <pre class=
"programlisting"><span class=
"identifier">T
</span> <span class=
"identifier">v
</span><span class=
"special">,
</span> <span class=
"identifier">z
</span> <span class=
"special">;
</span>
1465 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"identifier">def
</span><span class=
"special">;
</span>
1466 <span class=
"identifier">T
</span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"identifier">y
</span> <span class=
"special">=
</span> <span class=
"identifier">def
</span><span class=
"special">.
</span><span class=
"identifier">get_value_or
</span><span class=
"special">(
</span><span class=
"identifier">z
</span><span class=
"special">);
</span>
1467 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"identifier">y
</span> <span class=
"special">==
</span> <span class=
"identifier">z
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
1469 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"identifier">opt
</span> <span class=
"special">(
</span> <span class=
"identifier">v
</span> <span class=
"special">);
</span>
1470 <span class=
"identifier">T
</span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"identifier">u
</span> <span class=
"special">=
</span> <span class=
"identifier">get_optional_value_or
</span><span class=
"special">(
</span><span class=
"identifier">opt
</span><span class=
"special">,
</span><span class=
"identifier">z
</span><span class=
"special">);
</span>
1471 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"identifier">u
</span> <span class=
"special">==
</span> <span class=
"identifier">v
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
1472 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"identifier">u
</span> <span class=
"special">!=
</span> <span class=
"identifier">z
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
1477 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
1479 <a name=
"reference_optional_get_ptr"></a><div class=
"blockquote"><blockquote class=
"blockquote"><p>
1480 <code class=
"computeroutput"><span class=
"identifier">T
</span> <span class=
"keyword">const
</span><span class=
"special">*
</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span></code>
1481 <span class=
"emphasis"><em>(not a ref)
</em></span><code class=
"computeroutput"><span class=
"special">>::
</span><span class=
"identifier">get_ptr
</span><span class=
"special">()
</span> <span class=
"keyword">const
</span> <span class=
"special">;
</span></code>
1482 </p></blockquote></div>
1483 <div class=
"blockquote"><blockquote class=
"blockquote"><p>
1484 <code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">*
</span>
1485 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span></code> <span class=
"emphasis"><em>(not a ref)
</em></span><code class=
"computeroutput"><span class=
"special">>::
</span><span class=
"identifier">get_ptr
</span><span class=
"special">()
</span> <span class=
"special">;
</span></code>
1486 </p></blockquote></div>
1487 <div class=
"blockquote"><blockquote class=
"blockquote"><p>
1488 <code class=
"computeroutput"><span class=
"keyword">inline
</span> <span class=
"identifier">T
</span>
1489 <span class=
"keyword">const
</span><span class=
"special">*
</span> <span class=
"identifier">get_pointer
</span> <span class=
"special">(
</span>
1490 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span></code> <span class=
"emphasis"><em>(not a ref)
</em></span><code class=
"computeroutput"><span class=
"special">></span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"special">)
</span> <span class=
"special">;
</span></code>
1491 </p></blockquote></div>
1492 <div class=
"blockquote"><blockquote class=
"blockquote"><p>
1493 <code class=
"computeroutput"><span class=
"keyword">inline
</span> <span class=
"identifier">T
</span><span class=
"special">*
</span> <span class=
"identifier">get_pointer
</span>
1494 <span class=
"special">(
</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span></code>
1495 <span class=
"emphasis"><em>(not a ref)
</em></span><code class=
"computeroutput"><span class=
"special">></span>
1496 <span class=
"special">&)
</span> <span class=
"special">;
</span></code>
1497 </p></blockquote></div>
1498 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
1499 <li class=
"listitem">
1500 <span class=
"bold"><strong>Returns:
</strong></span> If
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is initialized, a pointer to the contained
1501 value; else
<code class=
"computeroutput"><span class=
"number">0</span></code> (
<span class=
"emphasis"><em>null
</em></span>).
1503 <li class=
"listitem">
1504 <span class=
"bold"><strong>Throws:
</strong></span> Nothing.
1506 <li class=
"listitem">
1507 <span class=
"bold"><strong>Notes:
</strong></span> The contained value is permanently
1508 stored within
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code>,
1509 so you should not hold nor delete this pointer
1511 <li class=
"listitem">
1512 <span class=
"bold"><strong>Example:
</strong></span>
1513 <pre class=
"programlisting"><span class=
"identifier">T
</span> <span class=
"identifier">v
</span><span class=
"special">;
</span>
1514 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"identifier">opt
</span><span class=
"special">(
</span><span class=
"identifier">v
</span><span class=
"special">);
</span>
1515 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"keyword">const
</span> <span class=
"identifier">copt
</span><span class=
"special">(
</span><span class=
"identifier">v
</span><span class=
"special">);
</span>
1516 <span class=
"identifier">T
</span><span class=
"special">*
</span> <span class=
"identifier">p
</span> <span class=
"special">=
</span> <span class=
"identifier">opt
</span><span class=
"special">.
</span><span class=
"identifier">get_ptr
</span><span class=
"special">()
</span> <span class=
"special">;
</span>
1517 <span class=
"identifier">T
</span> <span class=
"keyword">const
</span><span class=
"special">*
</span> <span class=
"identifier">cp
</span> <span class=
"special">=
</span> <span class=
"identifier">copt
</span><span class=
"special">.
</span><span class=
"identifier">get_ptr
</span><span class=
"special">();
</span>
1518 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"identifier">p
</span> <span class=
"special">==
</span> <span class=
"identifier">get_pointer
</span><span class=
"special">(
</span><span class=
"identifier">opt
</span><span class=
"special">)
</span> <span class=
"special">);
</span>
1519 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"identifier">cp
</span> <span class=
"special">==
</span> <span class=
"identifier">get_pointer
</span><span class=
"special">(
</span><span class=
"identifier">copt
</span><span class=
"special">)
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
1524 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
1526 <a name=
"reference_optional_operator_arrow"></a><div class=
"blockquote"><blockquote class=
"blockquote"><p>
1527 <code class=
"computeroutput"><span class=
"identifier">T
</span> <span class=
"keyword">const
</span><span class=
"special">*
</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span></code>
1528 <span class=
"emphasis"><em>(not a ref)
</em></span><code class=
"computeroutput"><span class=
"special">>::
</span><span class=
"keyword">operator
</span> <span class=
"special">-
>()
</span>
1529 <span class=
"keyword">const
</span> <span class=
"special">;
</span></code>
1530 </p></blockquote></div>
1531 <div class=
"blockquote"><blockquote class=
"blockquote"><p>
1532 <code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">*
</span>
1533 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span></code> <span class=
"emphasis"><em>(not a ref)
</em></span><code class=
"computeroutput"><span class=
"special">>::
</span><span class=
"keyword">operator
</span> <span class=
"special">-
>()
</span> <span class=
"special">;
</span></code>
1534 </p></blockquote></div>
1535 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
1536 <li class=
"listitem">
1537 <span class=
"bold"><strong>Requires:
</strong></span> <code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is initialized.
1539 <li class=
"listitem">
1540 <span class=
"bold"><strong>Returns:
</strong></span> A pointer to the contained value.
1542 <li class=
"listitem">
1543 <span class=
"bold"><strong>Throws:
</strong></span> Nothing.
1545 <li class=
"listitem">
1546 <span class=
"bold"><strong>Notes:
</strong></span> The requirement is asserted via
1547 <code class=
"computeroutput"><span class=
"identifier">BOOST_ASSERT
</span><span class=
"special">()
</span></code>.
1549 <li class=
"listitem">
1550 <span class=
"bold"><strong>Example:
</strong></span>
1551 <pre class=
"programlisting"><span class=
"keyword">struct
</span> <span class=
"identifier">X
</span> <span class=
"special">{
</span> <span class=
"keyword">int
</span> <span class=
"identifier">mdata
</span> <span class=
"special">;
</span> <span class=
"special">}
</span> <span class=
"special">;
</span>
1552 <span class=
"identifier">X
</span> <span class=
"identifier">x
</span> <span class=
"special">;
</span>
1553 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">X
</span><span class=
"special">></span> <span class=
"identifier">opt
</span> <span class=
"special">(
</span><span class=
"identifier">x
</span><span class=
"special">);
</span>
1554 <span class=
"identifier">opt
</span><span class=
"special">-
></span><span class=
"identifier">mdata
</span> <span class=
"special">=
</span> <span class=
"number">2</span> <span class=
"special">;
</span>
1559 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
1561 <a name=
"reference_optional_operator_bool"></a><div class=
"blockquote"><blockquote class=
"blockquote"><p>
1562 <code class=
"computeroutput"><span class=
"keyword">explicit
</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">>::
</span><span class=
"keyword">operator
</span> <span class=
"keyword">bool
</span><span class=
"special">()
</span> <span class=
"keyword">const
</span> <span class=
"special">;
</span></code>
1563 </p></blockquote></div>
1564 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
1565 <li class=
"listitem">
1566 <span class=
"bold"><strong>Returns:
</strong></span> <code class=
"computeroutput"><span class=
"identifier">get_ptr
</span><span class=
"special">()
</span> <span class=
"special">!=
</span> <span class=
"number">0</span></code>.
1568 <li class=
"listitem">
1569 <span class=
"bold"><strong>Throws:
</strong></span> Nothing.
1571 <li class=
"listitem">
1572 <span class=
"bold"><strong>Notes:
</strong></span> On compilers that do not support
1573 explicit conversion operators this falls back to safe-bool idiom.
1575 <li class=
"listitem">
1576 <span class=
"bold"><strong>Example:
</strong></span>
1577 <pre class=
"programlisting"><span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"identifier">def
</span> <span class=
"special">;
</span>
1578 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"identifier">def
</span> <span class=
"special">==
</span> <span class=
"number">0</span> <span class=
"special">);
</span>
1579 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"identifier">opt
</span> <span class=
"special">(
</span> <span class=
"identifier">v
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
1580 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"identifier">opt
</span> <span class=
"special">);
</span>
1581 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"identifier">opt
</span> <span class=
"special">!=
</span> <span class=
"number">0</span> <span class=
"special">);
</span>
1586 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
1588 <a name=
"reference_optional_operator_not"></a><div class=
"blockquote"><blockquote class=
"blockquote"><p>
1589 <code class=
"computeroutput"><span class=
"keyword">bool
</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">>::
</span><span class=
"keyword">operator
</span><span class=
"special">!()
</span> <span class=
"keyword">noexcept
</span> <span class=
"special">;
</span></code>
1590 </p></blockquote></div>
1591 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
1592 <li class=
"listitem">
1593 <span class=
"bold"><strong>Returns:
</strong></span> If
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code> is uninitialized,
<code class=
"computeroutput"><span class=
"keyword">true
</span></code>;
1594 else
<code class=
"computeroutput"><span class=
"keyword">false
</span></code>.
1596 <li class=
"listitem">
1597 <span class=
"bold"><strong>Notes:
</strong></span> This operator is provided for those
1598 compilers which can't use the
<span class=
"emphasis"><em>unspecified-bool-type operator
</em></span>
1599 in certain boolean contexts.
1601 <li class=
"listitem">
1602 <span class=
"bold"><strong>Example:
</strong></span>
1603 <pre class=
"programlisting"><span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"identifier">opt
</span> <span class=
"special">;
</span>
1604 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"special">!
</span><span class=
"identifier">opt
</span> <span class=
"special">);
</span>
1605 <span class=
"special">*
</span><span class=
"identifier">opt
</span> <span class=
"special">=
</span> <span class=
"identifier">some_T
</span> <span class=
"special">;
</span>
1607 <span class=
"comment">// Notice the
"double-bang" idiom here.
</span>
1608 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"special">!!
</span><span class=
"identifier">opt
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
1613 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
1615 <a name=
"reference_optional_is_initialized"></a><div class=
"blockquote"><blockquote class=
"blockquote"><p>
1616 <code class=
"computeroutput"><span class=
"keyword">bool
</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">>::
</span><span class=
"identifier">is_initialized
</span><span class=
"special">()
</span>
1617 <span class=
"keyword">const
</span> <span class=
"special">;
</span></code>
1618 </p></blockquote></div>
1619 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; "><li class=
"listitem">
1620 <span class=
"bold"><strong>Deprecated:
</strong></span> Same as
<code class=
"computeroutput"><span class=
"keyword">explicit
</span>
1621 <span class=
"keyword">operator
</span> <span class=
"keyword">bool
</span>
1622 <span class=
"special">()
</span> <span class=
"special">;
</span></code>
1625 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
1628 <a name=
"boost_optional.detailed_semantics.h1"></a>
1629 <span class=
"phrase"><a name=
"boost_optional.detailed_semantics.free_functions"></a></span><a class=
"link" href=
"detailed_semantics.html#boost_optional.detailed_semantics.free_functions">Free
1633 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
1635 <a name=
"reference_make_optional_value"></a><div class=
"blockquote"><blockquote class=
"blockquote"><p>
1636 <code class=
"computeroutput"><span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span></code> <span class=
"emphasis"><em>(not a ref)
</em></span><code class=
"computeroutput"><span class=
"special">></span> <span class=
"identifier">make_optional
</span><span class=
"special">(
</span> <span class=
"identifier">T
</span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"identifier">v
</span> <span class=
"special">)
</span></code>
1637 </p></blockquote></div>
1638 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
1639 <li class=
"listitem">
1640 <span class=
"bold"><strong>Returns:
</strong></span> <code class=
"computeroutput"><span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">>(
</span><span class=
"identifier">v
</span><span class=
"special">)
</span></code> for the
<span class=
"emphasis"><em>deduced
</em></span> type
1641 <code class=
"computeroutput"><span class=
"identifier">T
</span></code> of
<code class=
"computeroutput"><span class=
"identifier">v
</span></code>.
1643 <li class=
"listitem">
1644 <span class=
"bold"><strong>Example:
</strong></span>
1645 <pre class=
"programlisting"><span class=
"keyword">template
</span><span class=
"special"><</span><span class=
"keyword">class
</span> <span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"keyword">void
</span> <span class=
"identifier">foo
</span> <span class=
"special">(
</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"identifier">opt
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
1647 <span class=
"identifier">foo
</span> <span class=
"special">(
</span> <span class=
"identifier">make_optional
</span><span class=
"special">(
</span><span class=
"number">1</span><span class=
"special">+
</span><span class=
"number">1</span><span class=
"special">)
</span> <span class=
"special">)
</span> <span class=
"special">;
</span> <span class=
"comment">// Creates an optional
<int
></span>
1652 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
1654 <a name=
"reference_make_optional_bool_value"></a><div class=
"blockquote"><blockquote class=
"blockquote"><p>
1655 <code class=
"computeroutput"><span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span></code> <span class=
"emphasis"><em>(not a ref)
</em></span><code class=
"computeroutput"><span class=
"special">></span> <span class=
"identifier">make_optional
</span><span class=
"special">(
</span> <span class=
"keyword">bool
</span> <span class=
"identifier">condition
</span><span class=
"special">,
</span> <span class=
"identifier">T
</span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"identifier">v
</span> <span class=
"special">)
</span></code>
1656 </p></blockquote></div>
1657 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
1658 <li class=
"listitem">
1659 <span class=
"bold"><strong>Returns:
</strong></span> <code class=
"computeroutput"><span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">>(
</span><span class=
"identifier">condition
</span><span class=
"special">,
</span><span class=
"identifier">v
</span><span class=
"special">)
</span></code>
1660 for the
<span class=
"emphasis"><em>deduced
</em></span> type
<code class=
"computeroutput"><span class=
"identifier">T
</span></code>
1661 of
<code class=
"computeroutput"><span class=
"identifier">v
</span></code>.
1663 <li class=
"listitem">
1664 <span class=
"bold"><strong>Example:
</strong></span>
1665 <pre class=
"programlisting"><span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"keyword">double
</span><span class=
"special">></span> <span class=
"identifier">calculate_foo
</span><span class=
"special">()
</span>
1666 <span class=
"special">{
</span>
1667 <span class=
"keyword">double
</span> <span class=
"identifier">val
</span> <span class=
"special">=
</span> <span class=
"identifier">compute_foo
</span><span class=
"special">();
</span>
1668 <span class=
"keyword">return
</span> <span class=
"identifier">make_optional
</span><span class=
"special">(
</span><span class=
"identifier">is_not_nan_and_finite
</span><span class=
"special">(
</span><span class=
"identifier">val
</span><span class=
"special">),
</span><span class=
"identifier">val
</span><span class=
"special">);
</span>
1669 <span class=
"special">}
</span>
1671 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"keyword">double
</span><span class=
"special">></span> <span class=
"identifier">v
</span> <span class=
"special">=
</span> <span class=
"identifier">calculate_foo
</span><span class=
"special">();
</span>
1672 <span class=
"keyword">if
</span> <span class=
"special">(
</span> <span class=
"special">!
</span><span class=
"identifier">v
</span> <span class=
"special">)
</span>
1673 <span class=
"identifier">error
</span><span class=
"special">(
</span><span class=
"string">"foo wasn't computed"</span><span class=
"special">);
</span>
1678 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
1680 <a name=
"reference_operator_compare_equal_optional_optional"></a><div class=
"blockquote"><blockquote class=
"blockquote"><p>
1681 <code class=
"computeroutput"><span class=
"keyword">bool
</span> <span class=
"keyword">operator
</span>
1682 <span class=
"special">==
</span> <span class=
"special">(
</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"identifier">x
</span><span class=
"special">,
</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span>
1683 <span class=
"keyword">const
</span><span class=
"special">&</span>
1684 <span class=
"identifier">y
</span> <span class=
"special">);
</span></code>
1685 </p></blockquote></div>
1686 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
1687 <li class=
"listitem">
1688 <span class=
"bold"><strong>Requires:
</strong></span> <code class=
"computeroutput"><span class=
"identifier">T
</span></code>
1689 shall meet requirements of
<code class=
"computeroutput"><span class=
"identifier">EqualityComparable
</span></code>.
1691 <li class=
"listitem">
1692 <span class=
"bold"><strong>Returns:
</strong></span> If both
<code class=
"computeroutput"><span class=
"identifier">x
</span></code>
1693 and
<code class=
"computeroutput"><span class=
"identifier">y
</span></code> are initialized,
1694 <code class=
"computeroutput"><span class=
"special">(*
</span><span class=
"identifier">x
</span>
1695 <span class=
"special">==
</span> <span class=
"special">*
</span><span class=
"identifier">y
</span><span class=
"special">)
</span></code>. If
1696 only
<code class=
"computeroutput"><span class=
"identifier">x
</span></code> or
<code class=
"computeroutput"><span class=
"identifier">y
</span></code> is initialized,
<code class=
"computeroutput"><span class=
"keyword">false
</span></code>.
1697 If both are uninitialized,
<code class=
"computeroutput"><span class=
"keyword">true
</span></code>.
1699 <li class=
"listitem">
1700 <span class=
"bold"><strong>Throws:
</strong></span> Nothing.
1702 <li class=
"listitem">
1703 <span class=
"bold"><strong>Notes:
</strong></span> Pointers have shallow relational
1704 operators while
<code class=
"computeroutput"><span class=
"identifier">optional
</span></code>
1705 has deep relational operators. Do not use
<code class=
"computeroutput"><span class=
"keyword">operator
</span>
1706 <span class=
"special">==
</span></code> directly in generic code which
1707 expect to be given either an
<code class=
"computeroutput"><span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span></code> or a pointer; use
<a href=
"../../../../utility/OptionalPointee.html#equal" target=
"_top"><code class=
"computeroutput"><span class=
"identifier">equal_pointees
</span><span class=
"special">()
</span></code></a>
1710 <li class=
"listitem">
1711 <span class=
"bold"><strong>Example:
</strong></span>
1712 <pre class=
"programlisting"><span class=
"identifier">T
</span> <span class=
"identifier">x
</span><span class=
"special">(
</span><span class=
"number">12</span><span class=
"special">);
</span>
1713 <span class=
"identifier">T
</span> <span class=
"identifier">y
</span><span class=
"special">(
</span><span class=
"number">12</span><span class=
"special">);
</span>
1714 <span class=
"identifier">T
</span> <span class=
"identifier">z
</span><span class=
"special">(
</span><span class=
"number">21</span><span class=
"special">);
</span>
1715 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"identifier">def0
</span> <span class=
"special">;
</span>
1716 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"identifier">def1
</span> <span class=
"special">;
</span>
1717 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"identifier">optX
</span><span class=
"special">(
</span><span class=
"identifier">x
</span><span class=
"special">);
</span>
1718 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"identifier">optY
</span><span class=
"special">(
</span><span class=
"identifier">y
</span><span class=
"special">);
</span>
1719 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"identifier">optZ
</span><span class=
"special">(
</span><span class=
"identifier">z
</span><span class=
"special">);
</span>
1721 <span class=
"comment">// Identity always hold
</span>
1722 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"identifier">def0
</span> <span class=
"special">==
</span> <span class=
"identifier">def0
</span> <span class=
"special">);
</span>
1723 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"identifier">optX
</span> <span class=
"special">==
</span> <span class=
"identifier">optX
</span> <span class=
"special">);
</span>
1725 <span class=
"comment">// Both uninitialized compare equal
</span>
1726 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"identifier">def0
</span> <span class=
"special">==
</span> <span class=
"identifier">def1
</span> <span class=
"special">);
</span>
1728 <span class=
"comment">// Only one initialized compare unequal.
</span>
1729 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"identifier">def0
</span> <span class=
"special">!=
</span> <span class=
"identifier">optX
</span> <span class=
"special">);
</span>
1731 <span class=
"comment">// Both initialized compare as (*lhs == *rhs)
</span>
1732 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"identifier">optX
</span> <span class=
"special">==
</span> <span class=
"identifier">optY
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
1733 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"identifier">optX
</span> <span class=
"special">!=
</span> <span class=
"identifier">optZ
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
1738 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
1740 <a name=
"reference_operator_compare_less_optional_optional"></a><div class=
"blockquote"><blockquote class=
"blockquote"><p>
1741 <code class=
"computeroutput"><span class=
"keyword">bool
</span> <span class=
"keyword">operator
</span>
1742 <span class=
"special"><</span> <span class=
"special">(
</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"identifier">x
</span><span class=
"special">,
</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span>
1743 <span class=
"keyword">const
</span><span class=
"special">&</span>
1744 <span class=
"identifier">y
</span> <span class=
"special">);
</span></code>
1745 </p></blockquote></div>
1746 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
1747 <li class=
"listitem">
1748 <span class=
"bold"><strong>Requires:
</strong></span> <code class=
"computeroutput"><span class=
"identifier">T
</span></code>
1749 shall meet requirements of
<code class=
"computeroutput"><span class=
"identifier">LessThanComparable
</span></code>.
1751 <li class=
"listitem">
1752 <span class=
"bold"><strong>Returns:
</strong></span> If
<code class=
"computeroutput"><span class=
"identifier">y
</span></code>
1753 is not initialized,
<code class=
"computeroutput"><span class=
"keyword">false
</span></code>.
1754 If
<code class=
"computeroutput"><span class=
"identifier">y
</span></code> is initialized and
1755 <code class=
"computeroutput"><span class=
"identifier">x
</span></code> is not initialized,
1756 <code class=
"computeroutput"><span class=
"keyword">true
</span></code>. If both
<code class=
"computeroutput"><span class=
"identifier">x
</span></code> and
<code class=
"computeroutput"><span class=
"identifier">y
</span></code>
1757 are initialized,
<code class=
"computeroutput"><span class=
"special">(*
</span><span class=
"identifier">x
</span>
1758 <span class=
"special"><</span> <span class=
"special">*
</span><span class=
"identifier">y
</span><span class=
"special">)
</span></code>.
1760 <li class=
"listitem">
1761 <span class=
"bold"><strong>Throws:
</strong></span> Nothing.
1763 <li class=
"listitem">
1764 <span class=
"bold"><strong>Notes:
</strong></span> Pointers have shallow relational
1765 operators while
<code class=
"computeroutput"><span class=
"identifier">optional
</span></code>
1766 has deep relational operators. Do not use
<code class=
"computeroutput"><span class=
"keyword">operator
</span>
1767 <span class=
"special"><</span></code> directly in generic code which
1768 expect to be given either an
<code class=
"computeroutput"><span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span></code> or a pointer; use
<a href=
"../../../../utility/OptionalPointee.html#less" target=
"_top"><code class=
"computeroutput"><span class=
"identifier">less_pointees
</span><span class=
"special">()
</span></code></a>
1771 <li class=
"listitem">
1772 <span class=
"bold"><strong>Example:
</strong></span>
1773 <pre class=
"programlisting"><span class=
"identifier">T
</span> <span class=
"identifier">x
</span><span class=
"special">(
</span><span class=
"number">12</span><span class=
"special">);
</span>
1774 <span class=
"identifier">T
</span> <span class=
"identifier">y
</span><span class=
"special">(
</span><span class=
"number">34</span><span class=
"special">);
</span>
1775 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"identifier">def
</span> <span class=
"special">;
</span>
1776 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"identifier">optX
</span><span class=
"special">(
</span><span class=
"identifier">x
</span><span class=
"special">);
</span>
1777 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"identifier">optY
</span><span class=
"special">(
</span><span class=
"identifier">y
</span><span class=
"special">);
</span>
1779 <span class=
"comment">// Identity always hold
</span>
1780 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"special">!(
</span><span class=
"identifier">def
</span> <span class=
"special"><</span> <span class=
"identifier">def
</span><span class=
"special">)
</span> <span class=
"special">);
</span>
1781 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"identifier">optX
</span> <span class=
"special">==
</span> <span class=
"identifier">optX
</span> <span class=
"special">);
</span>
1783 <span class=
"comment">// Both uninitialized compare equal
</span>
1784 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"identifier">def0
</span> <span class=
"special">==
</span> <span class=
"identifier">def1
</span> <span class=
"special">);
</span>
1786 <span class=
"comment">// Only one initialized compare unequal.
</span>
1787 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"identifier">def0
</span> <span class=
"special">!=
</span> <span class=
"identifier">optX
</span> <span class=
"special">);
</span>
1789 <span class=
"comment">// Both initialized compare as (*lhs == *rhs)
</span>
1790 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"identifier">optX
</span> <span class=
"special">==
</span> <span class=
"identifier">optY
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
1791 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"identifier">optX
</span> <span class=
"special">!=
</span> <span class=
"identifier">optZ
</span> <span class=
"special">)
</span> <span class=
"special">;
</span>
1796 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
1798 <a name=
"reference_operator_compare_not_equal_optional_optional"></a><div class=
"blockquote"><blockquote class=
"blockquote"><p>
1799 <code class=
"computeroutput"><span class=
"keyword">bool
</span> <span class=
"keyword">operator
</span>
1800 <span class=
"special">!=
</span> <span class=
"special">(
</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"identifier">x
</span><span class=
"special">,
</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span>
1801 <span class=
"keyword">const
</span><span class=
"special">&</span>
1802 <span class=
"identifier">y
</span> <span class=
"special">);
</span></code>
1803 </p></blockquote></div>
1804 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
1805 <li class=
"listitem">
1806 <span class=
"bold"><strong>Returns:
</strong></span> <code class=
"computeroutput"><span class=
"special">!(
</span>
1807 <span class=
"identifier">x
</span> <span class=
"special">==
</span>
1808 <span class=
"identifier">y
</span> <span class=
"special">);
</span></code>
1810 <li class=
"listitem">
1811 <span class=
"bold"><strong>Throws:
</strong></span> Nothing.
1815 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
1817 <a name=
"reference_operator_compare_greater_optional_optional"></a><div class=
"blockquote"><blockquote class=
"blockquote"><p>
1818 <code class=
"computeroutput"><span class=
"keyword">bool
</span> <span class=
"keyword">operator
</span>
1819 <span class=
"special">></span> <span class=
"special">(
</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"identifier">x
</span><span class=
"special">,
</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span>
1820 <span class=
"keyword">const
</span><span class=
"special">&</span>
1821 <span class=
"identifier">y
</span> <span class=
"special">);
</span></code>
1822 </p></blockquote></div>
1823 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
1824 <li class=
"listitem">
1825 <span class=
"bold"><strong>Returns:
</strong></span> <code class=
"computeroutput"><span class=
"special">(
</span>
1826 <span class=
"identifier">y
</span> <span class=
"special"><</span>
1827 <span class=
"identifier">x
</span> <span class=
"special">);
</span></code>
1829 <li class=
"listitem">
1830 <span class=
"bold"><strong>Throws:
</strong></span> Nothing.
1834 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
1836 <a name=
"reference_operator_compare_less_or_equal_optional_optional"></a><div class=
"blockquote"><blockquote class=
"blockquote"><p>
1837 <code class=
"computeroutput"><span class=
"keyword">bool
</span> <span class=
"keyword">operator
</span>
1838 <span class=
"special"><=
</span> <span class=
"special">(
</span>
1839 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"identifier">x
</span><span class=
"special">,
</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span>
1840 <span class=
"keyword">const
</span><span class=
"special">&</span>
1841 <span class=
"identifier">y
</span> <span class=
"special">);
</span></code>
1842 </p></blockquote></div>
1843 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
1844 <li class=
"listitem">
1845 <span class=
"bold"><strong>Returns:
</strong></span> <code class=
"computeroutput"><span class=
"special">!(
</span>
1846 <span class=
"identifier">y
</span> <span class=
"special"><</span>
1847 <span class=
"identifier">x
</span> <span class=
"special">);
</span></code>
1849 <li class=
"listitem">
1850 <span class=
"bold"><strong>Throws:
</strong></span> Nothing.
1854 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
1856 <a name=
"reference_operator_compare_greater_or_equal_optional_optional"></a><div class=
"blockquote"><blockquote class=
"blockquote"><p>
1857 <code class=
"computeroutput"><span class=
"keyword">bool
</span> <span class=
"keyword">operator
</span>
1858 <span class=
"special">>=
</span> <span class=
"special">(
</span>
1859 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"identifier">x
</span><span class=
"special">,
</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span>
1860 <span class=
"keyword">const
</span><span class=
"special">&</span>
1861 <span class=
"identifier">y
</span> <span class=
"special">);
</span></code>
1862 </p></blockquote></div>
1863 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
1864 <li class=
"listitem">
1865 <span class=
"bold"><strong>Returns:
</strong></span> <code class=
"computeroutput"><span class=
"special">!(
</span>
1866 <span class=
"identifier">x
</span><span class=
"special"><</span><span class=
"identifier">y
</span> <span class=
"special">);
</span></code>
1868 <li class=
"listitem">
1869 <span class=
"bold"><strong>Throws:
</strong></span> Nothing.
1872 <a name=
"reference_operator_compare_equal_optional_none"></a><div class=
"blockquote"><blockquote class=
"blockquote"><p>
1873 <code class=
"computeroutput"><span class=
"keyword">bool
</span> <span class=
"keyword">operator
</span>
1874 <span class=
"special">==
</span> <span class=
"special">(
</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"identifier">x
</span><span class=
"special">,
</span> <span class=
"identifier">none_t
</span>
1875 <span class=
"special">)
</span> <span class=
"keyword">noexcept
</span><span class=
"special">;
</span></code>
1876 </p></blockquote></div>
1877 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
1878 <li class=
"listitem">
1879 <span class=
"bold"><strong>Returns:
</strong></span> <code class=
"computeroutput"><span class=
"special">!
</span><span class=
"identifier">x
</span></code>.
1881 <li class=
"listitem">
1882 <span class=
"bold"><strong>Notes:
</strong></span> <code class=
"computeroutput"><span class=
"identifier">T
</span></code>
1883 need not meet requirements of
<code class=
"computeroutput"><span class=
"identifier">EqualityComparable
</span></code>.
1887 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
1889 <a name=
"reference_operator_compare_not_equal_optional_none"></a><div class=
"blockquote"><blockquote class=
"blockquote"><p>
1890 <code class=
"computeroutput"><span class=
"keyword">bool
</span> <span class=
"keyword">operator
</span>
1891 <span class=
"special">!=
</span> <span class=
"special">(
</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"identifier">x
</span><span class=
"special">,
</span> <span class=
"identifier">none_t
</span>
1892 <span class=
"special">)
</span> <span class=
"keyword">noexcept
</span><span class=
"special">;
</span></code>
1893 </p></blockquote></div>
1894 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; "><li class=
"listitem">
1895 <span class=
"bold"><strong>Returns:
</strong></span> <code class=
"computeroutput"><span class=
"special">!(
</span>
1896 <span class=
"identifier">x
</span> <span class=
"special">==
</span>
1897 <span class=
"identifier">y
</span> <span class=
"special">);
</span></code>
1900 <span class=
"inlinemediaobject"><img src=
"../images/space.png" alt=
"space"></span>
1902 <a name=
"reference_swap_optional_optional"></a><div class=
"blockquote"><blockquote class=
"blockquote"><p>
1903 <code class=
"computeroutput"><span class=
"keyword">void
</span> <span class=
"identifier">swap
</span>
1904 <span class=
"special">(
</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">>&</span>
1905 <span class=
"identifier">x
</span><span class=
"special">,
</span> <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">>&</span> <span class=
"identifier">y
</span> <span class=
"special">)
</span> <span class=
"special">;
</span></code>
1906 </p></blockquote></div>
1907 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
1908 <li class=
"listitem">
1909 <span class=
"bold"><strong>Effect:
</strong></span> If both
<code class=
"computeroutput"><span class=
"identifier">x
</span></code>
1910 and
<code class=
"computeroutput"><span class=
"identifier">y
</span></code> are initialized,
1911 calls
<code class=
"computeroutput"><span class=
"identifier">swap
</span><span class=
"special">(*
</span><span class=
"identifier">x
</span><span class=
"special">,*
</span><span class=
"identifier">y
</span><span class=
"special">)
</span></code> using
<code class=
"computeroutput"><span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">swap
</span></code>.
1912 If only one is initialized, say
<code class=
"computeroutput"><span class=
"identifier">x
</span></code>,
1913 calls:
<code class=
"computeroutput"><span class=
"identifier">y
</span><span class=
"special">.
</span><span class=
"identifier">reset
</span><span class=
"special">(*
</span><span class=
"identifier">x
</span><span class=
"special">);
</span> <span class=
"identifier">x
</span><span class=
"special">.
</span><span class=
"identifier">reset
</span><span class=
"special">();
</span></code> If none is initialized, does nothing.
1915 <li class=
"listitem">
1916 <span class=
"bold"><strong>Postconditions:
</strong></span> The states of
<code class=
"computeroutput"><span class=
"identifier">x
</span></code> and
<code class=
"computeroutput"><span class=
"identifier">y
</span></code>
1919 <li class=
"listitem">
1920 <span class=
"bold"><strong>Throws:
</strong></span> If both are initialized, whatever
1921 <code class=
"computeroutput"><span class=
"identifier">swap
</span><span class=
"special">(
</span><span class=
"identifier">T
</span><span class=
"special">&,
</span><span class=
"identifier">T
</span><span class=
"special">&)
</span></code>
1922 throws. If only one is initialized, whatever
<code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">::
</span><span class=
"identifier">T
</span> <span class=
"special">(
</span> <span class=
"identifier">T
</span><span class=
"special">&&</span>
1923 <span class=
"special">)
</span></code> throws.
1925 <li class=
"listitem">
1926 <span class=
"bold"><strong>Notes:
</strong></span> If both are initialized,
<code class=
"computeroutput"><span class=
"identifier">swap
</span><span class=
"special">(
</span><span class=
"identifier">T
</span><span class=
"special">&,
</span><span class=
"identifier">T
</span><span class=
"special">&)
</span></code>
1927 is used unqualified but with
<code class=
"computeroutput"><span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">swap
</span></code>
1928 introduced in scope. If only one is initialized,
<code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">::~
</span><span class=
"identifier">T
</span><span class=
"special">()
</span></code> and
<code class=
"computeroutput"><span class=
"identifier">T
</span><span class=
"special">::
</span><span class=
"identifier">T
</span><span class=
"special">(
</span>
1929 <span class=
"identifier">T
</span><span class=
"special">&&</span>
1930 <span class=
"special">)
</span></code> is called.
1932 <li class=
"listitem">
1933 <span class=
"bold"><strong>Exception Safety:
</strong></span> If both are initialized,
1934 this operation has the exception safety guarantees of
<code class=
"computeroutput"><span class=
"identifier">swap
</span><span class=
"special">(
</span><span class=
"identifier">T
</span><span class=
"special">&,
</span><span class=
"identifier">T
</span><span class=
"special">&)
</span></code>.
1935 If only one is initialized, it has the same basic guarantee as
<code class=
"computeroutput"><span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">>::
</span><span class=
"keyword">operator
</span><span class=
"special">=
</span> <span class=
"special">(
</span> <span class=
"identifier">T
</span><span class=
"special">&&</span>
1936 <span class=
"special">)
</span></code>.
1938 <li class=
"listitem">
1939 <span class=
"bold"><strong>Example:
</strong></span>
1940 <pre class=
"programlisting"><span class=
"identifier">T
</span> <span class=
"identifier">x
</span><span class=
"special">(
</span><span class=
"number">12</span><span class=
"special">);
</span>
1941 <span class=
"identifier">T
</span> <span class=
"identifier">y
</span><span class=
"special">(
</span><span class=
"number">21</span><span class=
"special">);
</span>
1942 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"identifier">def0
</span> <span class=
"special">;
</span>
1943 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"identifier">def1
</span> <span class=
"special">;
</span>
1944 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"identifier">optX
</span><span class=
"special">(
</span><span class=
"identifier">x
</span><span class=
"special">);
</span>
1945 <span class=
"identifier">optional
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span> <span class=
"identifier">optY
</span><span class=
"special">(
</span><span class=
"identifier">y
</span><span class=
"special">);
</span>
1947 <span class=
"identifier">boost
</span><span class=
"special">::
</span><span class=
"identifier">swap
</span><span class=
"special">(
</span><span class=
"identifier">def0
</span><span class=
"special">,
</span><span class=
"identifier">def1
</span><span class=
"special">);
</span> <span class=
"comment">// no-op
</span>
1949 <span class=
"identifier">boost
</span><span class=
"special">::
</span><span class=
"identifier">swap
</span><span class=
"special">(
</span><span class=
"identifier">def0
</span><span class=
"special">,
</span><span class=
"identifier">optX
</span><span class=
"special">);
</span>
1950 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"special">*
</span><span class=
"identifier">def0
</span> <span class=
"special">==
</span> <span class=
"identifier">x
</span> <span class=
"special">);
</span>
1951 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"special">!
</span><span class=
"identifier">optX
</span> <span class=
"special">);
</span>
1953 <span class=
"identifier">boost
</span><span class=
"special">::
</span><span class=
"identifier">swap
</span><span class=
"special">(
</span><span class=
"identifier">def0
</span><span class=
"special">,
</span><span class=
"identifier">optX
</span><span class=
"special">);
</span> <span class=
"comment">// Get back to original values
</span>
1955 <span class=
"identifier">boost
</span><span class=
"special">::
</span><span class=
"identifier">swap
</span><span class=
"special">(
</span><span class=
"identifier">optX
</span><span class=
"special">,
</span><span class=
"identifier">optY
</span><span class=
"special">);
</span>
1956 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"special">*
</span><span class=
"identifier">optX
</span> <span class=
"special">==
</span> <span class=
"identifier">y
</span> <span class=
"special">);
</span>
1957 <span class=
"identifier">assert
</span> <span class=
"special">(
</span> <span class=
"special">*
</span><span class=
"identifier">optY
</span> <span class=
"special">==
</span> <span class=
"identifier">x
</span> <span class=
"special">);
</span>
1962 <table xmlns:
rev=
"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width=
"100%"><tr>
1963 <td align=
"left"></td>
1964 <td align=
"right"><div class=
"copyright-footer">Copyright
© 2003-
2007 Fernando Luis Cacciola Carballal
<br>Copyright
© 2014 Andrzej Krzemie
ński
<p>
1965 Distributed under the Boost Software License, Version
1.0. (See accompanying
1966 file LICENSE_1_0.txt or copy at
<a href=
"http://www.boost.org/LICENSE_1_0.txt" target=
"_top">http://www.boost.org/LICENSE_1_0.txt
</a>)
1971 <div class=
"spirit-nav">
1972 <a accesskey=
"p" href=
"synopsis.html"><img src=
"../../../../../doc/src/images/prev.png" alt=
"Prev"></a><a accesskey=
"u" href=
"../index.html"><img src=
"../../../../../doc/src/images/up.png" alt=
"Up"></a><a accesskey=
"h" href=
"../index.html"><img src=
"../../../../../doc/src/images/home.png" alt=
"Home"></a><a accesskey=
"n" href=
"dependencies_and_portability.html"><img src=
"../../../../../doc/src/images/next.png" alt=
"Next"></a>