]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/optional/doc/html/boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html
bump version to 12.2.2-pve1
[ceph.git] / ceph / src / boost / libs / optional / doc / html / boost_optional / reference / header__boost_optional_optional_hpp_ / detailed_semantics.html
CommitLineData
7c673cae
FG
1<html>
2<head>
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="Boost.Optional">
8<link rel="up" href="../../../optional/reference/header__boost_optional_optional_hpp_.html" title="Header &lt;boost/optional/optional.hpp&gt;">
9<link rel="prev" href="header_optional_optional_refs.html" title="Optional References">
10<link rel="next" href="header__boost_optional_hpp_.html" title="Header &lt;boost/optional.hpp&gt;">
11</head>
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>
20</tr></table>
21<hr>
22<div class="spirit-nav">
23<a accesskey="p" href="header_optional_optional_refs.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../../optional/reference/header__boost_optional_optional_hpp_.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="header__boost_optional_hpp_.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
24</div>
25<div class="section">
26<div class="titlepage"><div><div><h4 class="title">
27<a name="boost_optional.reference.header__boost_optional_optional_hpp_.detailed_semantics"></a><a class="link" href="detailed_semantics.html" title="Detailed Semantics">Detailed
28 Semantics</a>
29</h4></div></div></div>
30<p>
31 Because <code class="computeroutput"><span class="identifier">T</span></code> might be of reference
32 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
33 be distinguished using the following convention:
34 </p>
35<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
36<li class="listitem">
37 If the entry reads: <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code><span class="emphasis"><em>(not
38 a ref)</em></span><code class="computeroutput"><span class="special">&gt;</span></code>,
39 the description corresponds only to the case where <code class="computeroutput"><span class="identifier">T</span></code>
40 is not of reference type.
41 </li>
42<li class="listitem">
43 If the entry reads: <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span></code>, the description corresponds
44 only to the case where <code class="computeroutput"><span class="identifier">T</span></code>
45 is of reference type.
46 </li>
47<li class="listitem">
48 If the entry reads: <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code>, the description is the same for
49 both cases.
50 </li>
51</ul></div>
52<div class="note"><table border="0" summary="Note">
53<tr>
54<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../../doc/src/images/note.png"></td>
55<th align="left">Note</th>
56</tr>
57<tr><td align="left" valign="top"><p>
58 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
59 as sample code. It is not implied that the type <code class="computeroutput"><span class="identifier">T</span></code>
60 must support each particular expression but that if the expression is
61 supported, the implied condition holds.
62 </p></td></tr>
63</table></div>
64<p>
65 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
66 </p>
67<h6>
68<a name="boost_optional.reference.header__boost_optional_optional_hpp_.detailed_semantics.h0"></a>
69 <span class="phrase"><a name="boost_optional.reference.header__boost_optional_optional_hpp_.detailed_semantics.optional_class_member_functions"></a></span><a class="link" href="detailed_semantics.html#boost_optional.reference.header__boost_optional_optional_hpp_.detailed_semantics.optional_class_member_functions">optional
70 class member functions</a>
71 </h6>
72<p>
73 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
74 </p>
75<a name="reference_optional_constructor"></a><div class="blockquote"><blockquote class="blockquote"><p>
76 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">optional</span><span class="special">()</span>
77 <span class="keyword">noexcept</span><span class="special">;</span></code>
78 </p></blockquote></div>
79<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
80<li class="listitem">
81 <span class="bold"><strong>Effect:</strong></span> Default-Constructs an <code class="computeroutput"><span class="identifier">optional</span></code>.
82 </li>
83<li class="listitem">
84 <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 </li>
86<li class="listitem">
87 <span class="bold"><strong>Notes:</strong></span> T's default constructor <span class="underline">is not</span> called.
88 </li>
89<li class="listitem">
90 <span class="bold"><strong>Example:</strong></span>
91<pre class="programlisting"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">def</span> <span class="special">;</span>
92<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>
93</pre>
94 </li>
95</ul></div>
96<p>
97 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
98 </p>
99<a name="reference_optional_constructor_none_t"></a><div class="blockquote"><blockquote class="blockquote"><p>
100 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">optional</span><span class="special">(</span>
101 <span class="identifier">none_t</span> <span class="special">)</span>
102 <span class="keyword">noexcept</span><span class="special">;</span></code>
103 </p></blockquote></div>
104<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
105<li class="listitem">
106 <span class="bold"><strong>Effect:</strong></span> Constructs an <code class="computeroutput"><span class="identifier">optional</span></code> uninitialized.
107 </li>
108<li class="listitem">
109 <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>.
110 </li>
111<li class="listitem">
112 <span class="bold"><strong>Notes:</strong></span> <code class="computeroutput"><span class="identifier">T</span></code>'s
113 default constructor <span class="underline">is not</span> called.
114 The expression <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">none</span></code>
115 denotes an instance of <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">none_t</span></code>
116 that can be used as the parameter.
117 </li>
118<li class="listitem">
119 <span class="bold"><strong>Example:</strong></span>
120<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</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">&gt;</span>
121<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">n</span><span class="special">(</span><span class="identifier">none</span><span class="special">)</span> <span class="special">;</span>
122<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>
123</pre>
124 </li>
125</ul></div>
126<p>
127 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
128 </p>
129<a name="reference_optional_constructor_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
130 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span> </code><span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">optional</span><span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">v</span> <span class="special">)</span></code>
131 </p></blockquote></div>
132<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
133<li class="listitem">
134 <span class="bold"><strong>Requires:</strong></span> <code class="computeroutput"><span class="identifier">is_copy_constructible</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span></code>
135 is <code class="computeroutput"><span class="keyword">true</span></code>.
136 </li>
137<li class="listitem">
138 <span class="bold"><strong>Effect:</strong></span> Directly-Constructs an <code class="computeroutput"><span class="identifier">optional</span></code>.
139 </li>
140<li class="listitem">
141 <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>
142 and its value is a <span class="emphasis"><em>copy</em></span> of <code class="computeroutput"><span class="identifier">v</span></code>.
143 </li>
144<li class="listitem">
145 <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> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span>
146 <span class="special">)</span></code> throws.
147 </li>
148<li class="listitem">
149 <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> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span>
150 <span class="special">)</span></code> is called.
151 </li>
152<li class="listitem">
153 <span class="bold"><strong>Exception Safety:</strong></span> Exceptions can only
154 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="keyword">const</span><span class="special">&amp;</span>
155 <span class="special">);</span></code> in that case, this constructor
156 has no effect.
157 </li>
158<li class="listitem">
159 <span class="bold"><strong>Example:</strong></span>
160<pre class="programlisting"><span class="identifier">T</span> <span class="identifier">v</span><span class="special">;</span>
161<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">opt</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span>
162<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>
163</pre>
164 </li>
165</ul></div>
166<p>
167 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
168 </p>
169<div class="blockquote"><blockquote class="blockquote"><p>
170 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;::</span><span class="identifier">optional</span><span class="special">(</span>
171 <span class="identifier">T</span><span class="special">&amp;</span>
172 <span class="identifier">ref</span> <span class="special">)</span></code>
173 </p></blockquote></div>
174<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
175<li class="listitem">
176 <span class="bold"><strong>Effect:</strong></span> Directly-Constructs an <code class="computeroutput"><span class="identifier">optional</span></code>.
177 </li>
178<li class="listitem">
179 <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>
180 and its value is an instance of an internal type wrapping the reference
181 <code class="computeroutput"><span class="identifier">ref</span></code>.
182 </li>
183<li class="listitem">
184 <span class="bold"><strong>Throws:</strong></span> Nothing.
185 </li>
186<li class="listitem">
187 <span class="bold"><strong>Example:</strong></span>
188<pre class="programlisting"><span class="identifier">T</span> <span class="identifier">v</span><span class="special">;</span>
189<span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">vref</span> <span class="special">=</span> <span class="identifier">v</span> <span class="special">;</span>
190<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span> <span class="identifier">opt</span><span class="special">(</span><span class="identifier">vref</span><span class="special">);</span>
191<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>
192<span class="special">++</span> <span class="identifier">v</span> <span class="special">;</span> <span class="comment">// mutate referee</span>
193<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</pre>
195 </li>
196</ul></div>
197<p>
198 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
199 </p>
200<a name="reference_optional_constructor_move_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
201 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span> </code><span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">optional</span><span class="special">(</span> <span class="identifier">T</span><span class="special">&amp;&amp;</span> <span class="identifier">v</span>
202 <span class="special">)</span></code>
203 </p></blockquote></div>
204<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
205<li class="listitem">
206 <span class="bold"><strong>Requires:</strong></span> <code class="computeroutput"><span class="identifier">is_move_constructible</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span></code>
207 is <code class="computeroutput"><span class="keyword">true</span></code>.
208 </li>
209<li class="listitem">
210 <span class="bold"><strong>Effect:</strong></span> Directly-Move-Constructs an
211 <code class="computeroutput"><span class="identifier">optional</span></code>.
212 </li>
213<li class="listitem">
214 <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>
215 and its value is move-constructed from <code class="computeroutput"><span class="identifier">v</span></code>.
216 </li>
217<li class="listitem">
218 <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> <span class="identifier">T</span><span class="special">&amp;&amp;</span> <span class="special">)</span></code>
219 throws.
220 </li>
221<li class="listitem">
222 <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> <span class="identifier">T</span><span class="special">&amp;&amp;</span> <span class="special">)</span></code>
223 is called.
224 </li>
225<li class="listitem">
226 <span class="bold"><strong>Exception Safety:</strong></span> Exceptions can only
227 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">&amp;&amp;</span> <span class="special">);</span></code>
228 in that case, the state of <code class="computeroutput"><span class="identifier">v</span></code>
229 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">&amp;&amp;)</span></code>.
230 </li>
231<li class="listitem">
232 <span class="bold"><strong>Example:</strong></span>
233<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>
234<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</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>
235<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>
236</pre>
237 </li>
238</ul></div>
239<p>
240 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
241 </p>
242<div class="blockquote"><blockquote class="blockquote"><p>
243 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;::</span><span class="identifier">optional</span><span class="special">(</span>
244 <span class="identifier">T</span><span class="special">&amp;&amp;</span>
245 <span class="identifier">ref</span> <span class="special">)</span>
246 <span class="special">=</span> <span class="keyword">delete</span></code>
247 </p></blockquote></div>
248<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
249 <span class="bold"><strong>Notes:</strong></span> This constructor is deleted
250 </li></ul></div>
251<p>
252 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
253 </p>
254<a name="reference_optional_constructor_bool_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
255 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">optional</span><span class="special">(</span> <span class="keyword">bool</span> <span class="identifier">condition</span><span class="special">,</span>
256 <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span></code>
257 </p></blockquote></div>
258<div class="blockquote"><blockquote class="blockquote"><p>
259 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span>
260 <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>
261 <span class="identifier">T</span><span class="special">&amp;</span>
262 <span class="identifier">v</span> <span class="special">)</span>
263 <span class="special">;</span></code>
264 </p></blockquote></div>
265<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
266 If condition is true, same as:
267 </li></ul></div>
268<div class="blockquote"><blockquote class="blockquote"><p>
269 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">optional</span><span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">v</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">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span>
273 <span class="special">::</span><span class="identifier">optional</span><span class="special">(</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">v</span> <span class="special">)</span></code>
274 </p></blockquote></div>
275<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
276 otherwise, same as:
277 </li></ul></div>
278<div class="blockquote"><blockquote class="blockquote"><p>
279 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span> </code><span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">optional</span><span class="special">()</span></code>
280 </p></blockquote></div>
281<div class="blockquote"><blockquote class="blockquote"><p>
282 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span>
283 <span class="special">::</span><span class="identifier">optional</span><span class="special">()</span></code>
284 </p></blockquote></div>
285<p>
286 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
287 </p>
288<a name="reference_optional_constructor_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
289 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span> </code><span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">optional</span><span class="special">(</span> <span class="identifier">optional</span>
290 <span class="keyword">const</span><span class="special">&amp;</span>
291 <span class="identifier">rhs</span> <span class="special">);</span></code>
292 </p></blockquote></div>
293<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
294<li class="listitem">
295 <span class="bold"><strong>Requires:</strong></span> <code class="computeroutput"><span class="identifier">is_copy_constructible</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span></code>
296 is <code class="computeroutput"><span class="keyword">true</span></code>.
297 </li>
298<li class="listitem">
299 <span class="bold"><strong>Effect:</strong></span> Copy-Constructs an <code class="computeroutput"><span class="identifier">optional</span></code>.
300 </li>
301<li class="listitem">
302 <span class="bold"><strong>Postconditions:</strong></span> If rhs is initialized,
303 <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
304 is initialized and its value is a <span class="emphasis"><em>copy</em></span> of the
305 value of <code class="computeroutput"><span class="identifier">rhs</span></code>; else
306 <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
307 is uninitialized.
308 </li>
309<li class="listitem">
310 <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> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span>
311 <span class="special">)</span></code> throws.
312 </li>
313<li class="listitem">
314 <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">&amp;</span> <span class="special">)</span></code>
315 is called.
316 </li>
317<li class="listitem">
318 <span class="bold"><strong>Exception Safety:</strong></span> Exceptions can only
319 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="keyword">const</span><span class="special">&amp;</span>
320 <span class="special">);</span></code> in that case, this constructor
321 has no effect.
322 </li>
323<li class="listitem">
324 <span class="bold"><strong>Example:</strong></span>
325<pre class="programlisting"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">uninit</span> <span class="special">;</span>
326<span class="identifier">assert</span> <span class="special">(!</span><span class="identifier">uninit</span><span class="special">);</span>
327
328<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">uinit2</span> <span class="special">(</span> <span class="identifier">uninit</span> <span class="special">)</span> <span class="special">;</span>
329<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>
330
331<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</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>
332<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>
333
334<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">init2</span> <span class="special">(</span> <span class="identifier">init</span> <span class="special">)</span> <span class="special">;</span>
335<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>
336</pre>
337 </li>
338</ul></div>
339<p>
340 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
341 </p>
342<div class="blockquote"><blockquote class="blockquote"><p>
343 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;::</span><span class="identifier">optional</span><span class="special">(</span>
344 <span class="identifier">optional</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rhs</span>
345 <span class="special">);</span></code>
346 </p></blockquote></div>
347<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
348<li class="listitem">
349 <span class="bold"><strong>Effect:</strong></span> Copy-Constructs an <code class="computeroutput"><span class="identifier">optional</span></code>.
350 </li>
351<li class="listitem">
352 <span class="bold"><strong>Postconditions:</strong></span> If <code class="computeroutput"><span class="identifier">rhs</span></code>
353 is initialized, <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
354 is initialized and its value is another reference to the same object
355 referenced by <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code>;
356 else <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
357 is uninitialized.
358 </li>
359<li class="listitem">
360 <span class="bold"><strong>Throws:</strong></span> Nothing.
361 </li>
362<li class="listitem">
363 <span class="bold"><strong>Notes:</strong></span> If <code class="computeroutput"><span class="identifier">rhs</span></code>
364 is initialized, both <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> and <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code> will refer to the same object
365 (they alias).
366 </li>
367<li class="listitem">
368 <span class="bold"><strong>Example:</strong></span>
369<pre class="programlisting"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span> <span class="identifier">uninit</span> <span class="special">;</span>
370<span class="identifier">assert</span> <span class="special">(!</span><span class="identifier">uninit</span><span class="special">);</span>
371
372<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span> <span class="identifier">uinit2</span> <span class="special">(</span> <span class="identifier">uninit</span> <span class="special">)</span> <span class="special">;</span>
373<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>
374
375<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">&amp;</span> <span class="identifier">ref</span> <span class="special">=</span> <span class="identifier">v</span> <span class="special">;</span>
376<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">init</span><span class="special">(</span><span class="identifier">ref</span><span class="special">);</span>
377<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>
378
379<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">init2</span> <span class="special">(</span> <span class="identifier">init</span> <span class="special">)</span> <span class="special">;</span>
380<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>
381
382<span class="identifier">v</span> <span class="special">=</span> <span class="number">3</span> <span class="special">;</span>
383
384<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>
385<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>
386</pre>
387 </li>
388</ul></div>
389<p>
390 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
391 </p>
392<a name="reference_optional_move_constructor_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
393 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span> </code><span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">optional</span><span class="special">(</span> <span class="identifier">optional</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span>
394 <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>
395 </p></blockquote></div>
396<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
397<li class="listitem">
398 <span class="bold"><strong>Requires:</strong></span> <code class="computeroutput"><span class="identifier">is_move_constructible</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span></code>
399 is <code class="computeroutput"><span class="keyword">true</span></code>.
400 </li>
401<li class="listitem">
402 <span class="bold"><strong>Effect:</strong></span> Move-constructs an <code class="computeroutput"><span class="identifier">optional</span></code>.
403 </li>
404<li class="listitem">
405 <span class="bold"><strong>Postconditions:</strong></span> If <code class="computeroutput"><span class="identifier">rhs</span></code>
406 is initialized, <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
407 is initialized and its value is move constructed from <code class="computeroutput"><span class="identifier">rhs</span></code>; else <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is uninitialized.
408 </li>
409<li class="listitem">
410 <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> <span class="identifier">T</span><span class="special">&amp;&amp;</span> <span class="special">)</span></code>
411 throws.
412 </li>
413<li class="listitem">
414 <span class="bold"><strong>Remarks:</strong></span> The expression inside <code class="computeroutput"><span class="keyword">noexcept</span></code> is equivalent to <code class="computeroutput"><span class="identifier">is_nothrow_move_constructible</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span></code>.
415 </li>
416<li class="listitem">
417 <span class="bold"><strong>Notes:</strong></span> If <code class="computeroutput"><span class="identifier">rhs</span></code>
418 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="special">&amp;&amp;</span>
419 <span class="special">)</span></code> is called.
420 </li>
421<li class="listitem">
422 <span class="bold"><strong>Exception Safety:</strong></span> Exceptions can only
423 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">&amp;&amp;</span> <span class="special">);</span></code>
424 in that case, <code class="computeroutput"><span class="identifier">rhs</span></code> remains
425 initialized and the value of <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code> is determined by exception safety
426 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">&amp;&amp;)</span></code>.
427 </li>
428<li class="listitem">
429 <span class="bold"><strong>Example:</strong></span>
430<pre class="programlisting"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">unique_ptr</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&gt;</span> <span class="identifier">uninit</span> <span class="special">;</span>
431<span class="identifier">assert</span> <span class="special">(!</span><span class="identifier">uninit</span><span class="special">);</span>
432
433<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">unique_ptr</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&gt;</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>
434<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>
435
436<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">unique_ptr</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&gt;</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">&lt;</span><span class="identifier">T</span><span class="special">&gt;(</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>
437<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>
438
439<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">unique_ptr</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&gt;</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>
440<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">init</span> <span class="special">);</span>
441<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>
442<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">init2</span> <span class="special">);</span>
443<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>
444</pre>
445 </li>
446</ul></div>
447<p>
448 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
449 </p>
450<div class="blockquote"><blockquote class="blockquote"><p>
451 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;::</span><span class="identifier">optional</span><span class="special">(</span>
452 <span class="identifier">optional</span> <span class="special">&amp;&amp;</span>
453 <span class="identifier">rhs</span> <span class="special">);</span></code>
454 </p></blockquote></div>
455<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
456<li class="listitem">
457 <span class="bold"><strong>Effect:</strong></span> Move-Constructs an <code class="computeroutput"><span class="identifier">optional</span></code>.
458 </li>
459<li class="listitem">
460 <span class="bold"><strong>Postconditions:</strong></span> If <code class="computeroutput"><span class="identifier">rhs</span></code>
461 is initialized, <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
462 is initialized and its value is another reference to the same object
463 referenced by <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code>;
464 else <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
465 is uninitialized.
466 </li>
467<li class="listitem">
468 <span class="bold"><strong>Throws:</strong></span> Nothing.
469 </li>
470<li class="listitem">
471 <span class="bold"><strong>Notes:</strong></span> If <code class="computeroutput"><span class="identifier">rhs</span></code>
472 is initialized, both <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> and <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code> will refer to the same object
473 (they alias).
474 </li>
475<li class="listitem">
476 <span class="bold"><strong>Example:</strong></span>
477<pre class="programlisting"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">unique_ptr</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&amp;&gt;</span> <span class="identifier">uninit</span> <span class="special">;</span>
478<span class="identifier">assert</span> <span class="special">(!</span><span class="identifier">uninit</span><span class="special">);</span>
479
480<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">unique_ptr</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&amp;&gt;</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>
481<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>
482
483<span class="identifier">std</span><span class="special">::</span><span class="identifier">unique_ptr</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</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>
484<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">unique_ptr</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&amp;&gt;</span> <span class="identifier">init</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span>
485<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>
486
487<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">unique_ptr</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&amp;&gt;</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>
488<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>
489
490<span class="special">*</span><span class="identifier">v</span> <span class="special">=</span> <span class="number">3</span> <span class="special">;</span>
491
492<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>
493<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>
494</pre>
495 </li>
496</ul></div>
497<p>
498 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
499 </p>
500<a name="reference_optional_constructor_other_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
501 <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;</span> <span class="keyword">explicit</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
502 <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">optional</span><span class="special">(</span>
503 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rhs</span> <span class="special">);</span></code>
504 </p></blockquote></div>
505<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
506<li class="listitem">
507 <span class="bold"><strong>Effect:</strong></span> Copy-Constructs an <code class="computeroutput"><span class="identifier">optional</span></code>.
508 </li>
509<li class="listitem">
510 <span class="bold"><strong>Postconditions:</strong></span> If <code class="computeroutput"><span class="identifier">rhs</span></code>
511 is initialized, <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
512 is initialized and its value is a <span class="emphasis"><em>copy</em></span> of the
513 value of rhs converted to type <code class="computeroutput"><span class="identifier">T</span></code>;
514 else <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
515 is uninitialized.
516 </li>
517<li class="listitem">
518 <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> <span class="identifier">U</span> <span class="keyword">const</span><span class="special">&amp;</span>
519 <span class="special">)</span></code> throws.
520 </li>
521<li class="listitem">
522 <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> <span class="identifier">U</span> <span class="keyword">const</span><span class="special">&amp;</span>
523 <span class="special">)</span></code> is called if <code class="computeroutput"><span class="identifier">rhs</span></code> is initialized, which requires
524 a valid conversion from <code class="computeroutput"><span class="identifier">U</span></code>
525 to <code class="computeroutput"><span class="identifier">T</span></code>.
526 </li>
527<li class="listitem">
528 <span class="bold"><strong>Exception Safety:</strong></span> Exceptions can only
529 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="keyword">const</span><span class="special">&amp;</span>
530 <span class="special">);</span></code> in that case, this constructor
531 has no effect.
532 </li>
533<li class="listitem">
534 <span class="bold"><strong>Example:</strong></span>
535<pre class="programlisting"><span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&gt;</span> <span class="identifier">x</span><span class="special">(</span><span class="number">123.4</span><span class="special">);</span>
536<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>
537
538<span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">y</span><span class="special">(</span><span class="identifier">x</span><span class="special">)</span> <span class="special">;</span>
539<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>
540</pre>
541 </li>
542</ul></div>
543<p>
544 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
545 </p>
546<a name="reference_optional_move_constructor_other_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
547 <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;</span> <span class="keyword">explicit</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
548 <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">optional</span><span class="special">(</span>
549 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;&amp;&amp;</span>
550 <span class="identifier">rhs</span> <span class="special">);</span></code>
551 </p></blockquote></div>
552<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
553<li class="listitem">
554 <span class="bold"><strong>Effect:</strong></span> Move-constructs an <code class="computeroutput"><span class="identifier">optional</span></code>.
555 </li>
556<li class="listitem">
557 <span class="bold"><strong>Postconditions:</strong></span> If <code class="computeroutput"><span class="identifier">rhs</span></code>
558 is initialized, <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
559 is initialized and its value is move-constructed from <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code>;
560 else <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
561 is uninitialized.
562 </li>
563<li class="listitem">
564 <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> <span class="identifier">U</span><span class="special">&amp;&amp;</span> <span class="special">)</span></code>
565 throws.
566 </li>
567<li class="listitem">
568 <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> <span class="identifier">U</span><span class="special">&amp;&amp;</span> <span class="special">)</span></code>
569 is called if <code class="computeroutput"><span class="identifier">rhs</span></code> is
570 initialized, which requires a valid conversion from <code class="computeroutput"><span class="identifier">U</span></code>
571 to <code class="computeroutput"><span class="identifier">T</span></code>.
572 </li>
573<li class="listitem">
574 <span class="bold"><strong>Exception Safety:</strong></span> Exceptions can only
575 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">&amp;&amp;</span> <span class="special">);</span></code>
576 in that case, <code class="computeroutput"><span class="identifier">rhs</span></code> remains
577 initialized and the value of <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code> is determined by exception safety
578 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">&amp;&amp;</span>
579 <span class="special">)</span></code>.
580 </li>
581<li class="listitem">
582 <span class="bold"><strong>Example:</strong></span>
583<pre class="programlisting"><span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&gt;</span> <span class="identifier">x</span><span class="special">(</span><span class="number">123.4</span><span class="special">);</span>
584<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>
585
586<span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</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>
587<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>
588</pre>
589 </li>
590</ul></div>
591<p>
592 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
593 </p>
594<a name="reference_optional_constructor_factory"></a><div class="blockquote"><blockquote class="blockquote"><p>
595 <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="identifier">InPlaceFactory</span><span class="special">&gt;</span>
596 <span class="keyword">explicit</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
597 <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">optional</span><span class="special">(</span>
598 <span class="identifier">InPlaceFactory</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">f</span> <span class="special">);</span></code>
599 </p></blockquote></div>
600<div class="blockquote"><blockquote class="blockquote"><p>
601 <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="identifier">TypedInPlaceFactory</span><span class="special">&gt;</span>
602 <span class="keyword">explicit</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
603 <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">optional</span><span class="special">(</span>
604 <span class="identifier">TypedInPlaceFactory</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">f</span> <span class="special">);</span></code>
605 </p></blockquote></div>
606<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
607<li class="listitem">
608 <span class="bold"><strong>Effect:</strong></span> Constructs an <code class="computeroutput"><span class="identifier">optional</span></code> with a value of <code class="computeroutput"><span class="identifier">T</span></code> obtained from the factory.
609 </li>
610<li class="listitem">
611 <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>
612 and its value is <span class="emphasis"><em>directly given</em></span> from the factory
613 <code class="computeroutput"><span class="identifier">f</span></code> (i.e., the value
614 <span class="underline">is not copied</span>).
615 </li>
616<li class="listitem">
617 <span class="bold"><strong>Throws:</strong></span> Whatever the <code class="computeroutput"><span class="identifier">T</span></code> constructor called by the factory
618 throws.
619 </li>
620<li class="listitem">
621 <span class="bold"><strong>Notes:</strong></span> See <a class="link" href="../../tutorial/in_place_factories.html" title="In-Place Factories">In-Place
622 Factories</a>
623 </li>
624<li class="listitem">
625 <span class="bold"><strong>Exception Safety:</strong></span> Exceptions can only
626 be thrown during the call to the <code class="computeroutput"><span class="identifier">T</span></code>
627 constructor used by the factory; in that case, this constructor has
628 no effect.
629 </li>
630<li class="listitem">
631 <span class="bold"><strong>Example:</strong></span>
632<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>
633
634<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>
635
636<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">C</span><span class="special">&gt;</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>
637<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">C</span><span class="special">&gt;</span> <span class="identifier">y</span><span class="special">(</span> <span class="identifier">in_place</span><span class="special">&lt;</span><span class="identifier">C</span><span class="special">&gt;(</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>
638
639<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>
640<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>
641</pre>
642 </li>
643</ul></div>
644<p>
645 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
646 </p>
647<a name="reference_optional_operator_equal_none_t"></a><div class="blockquote"><blockquote class="blockquote"><p>
648 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&amp;</span>
649 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">none_t</span>
650 <span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span></code>
651 </p></blockquote></div>
652<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
653<li class="listitem">
654 <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
655 value.
656 </li>
657<li class="listitem">
658 <span class="bold"><strong>Postconditions: </strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is uninitialized.
659 </li>
660</ul></div>
661<p>
662 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
663 </p>
664<a name="reference_optional_operator_equal_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
665 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&amp;</span>
666 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">T</span>
667 <span class="keyword">const</span><span class="special">&amp;</span>
668 <span class="identifier">rhs</span> <span class="special">)</span>
669 <span class="special">;</span></code>
670 </p></blockquote></div>
671<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
672<li class="listitem">
673 <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>.
674 </li>
675<li class="listitem">
676 <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
677 a <span class="emphasis"><em>copy</em></span> of <code class="computeroutput"><span class="identifier">rhs</span></code>.
678 </li>
679<li class="listitem">
680 <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">&amp;</span>
681 <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">&amp;)</span></code>
682 throws.
683 </li>
684<li class="listitem">
685 <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 assignment operator is used,
686 otherwise, its copy-constructor is used.
687 </li>
688<li class="listitem">
689 <span class="bold"><strong>Exception Safety:</strong></span> In the event of
690 an exception, the initialization state of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is unchanged and its value unspecified
691 as far as <code class="computeroutput"><span class="identifier">optional</span></code>
692 is concerned (it is up to <code class="computeroutput"><span class="identifier">T</span></code>'s
693 <code class="computeroutput"><span class="keyword">operator</span><span class="special">=()</span></code>).
694 If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
695 is initially uninitialized and <code class="computeroutput"><span class="identifier">T</span></code>'s
696 <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.
697 </li>
698<li class="listitem">
699 <span class="bold"><strong>Example:</strong></span>
700<pre class="programlisting"><span class="identifier">T</span> <span class="identifier">x</span><span class="special">;</span>
701<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">def</span> <span class="special">;</span>
702<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">opt</span><span class="special">(</span><span class="identifier">x</span><span class="special">)</span> <span class="special">;</span>
703
704<span class="identifier">T</span> <span class="identifier">y</span><span class="special">;</span>
705<span class="identifier">def</span> <span class="special">=</span> <span class="identifier">y</span> <span class="special">;</span>
706<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>
707<span class="identifier">opt</span> <span class="special">=</span> <span class="identifier">y</span> <span class="special">;</span>
708<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>
709</pre>
710 </li>
711</ul></div>
712<p>
713 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
714 </p>
715<div class="blockquote"><blockquote class="blockquote"><p>
716 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;&amp;</span>
717 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">rhs</span>
718 <span class="special">)</span> <span class="special">;</span></code>
719 </p></blockquote></div>
720<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
721<li class="listitem">
722 <span class="bold"><strong>Effect:</strong></span> (Re)binds the wrapped reference.
723 </li>
724<li class="listitem">
725 <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
726 the same object referenced by <code class="computeroutput"><span class="identifier">rhs</span></code>.
727 </li>
728<li class="listitem">
729 <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>
730 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>
731 for details on this behavior.
732 </li>
733<li class="listitem">
734 <span class="bold"><strong>Example:</strong></span>
735<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>
736<span class="keyword">int</span> <span class="identifier">b</span> <span class="special">=</span> <span class="number">2</span> <span class="special">;</span>
737<span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">ra</span> <span class="special">=</span> <span class="identifier">a</span> <span class="special">;</span>
738<span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">rb</span> <span class="special">=</span> <span class="identifier">b</span> <span class="special">;</span>
739<span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&amp;&gt;</span> <span class="identifier">def</span> <span class="special">;</span>
740<span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&amp;&gt;</span> <span class="identifier">opt</span><span class="special">(</span><span class="identifier">ra</span><span class="special">)</span> <span class="special">;</span>
741
742<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>
743<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>
744<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>
745<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>
746<span class="keyword">int</span> <span class="identifier">c</span> <span class="special">=</span> <span class="number">3</span><span class="special">;</span>
747<span class="keyword">int</span><span class="special">&amp;</span> <span class="identifier">rc</span> <span class="special">=</span> <span class="identifier">c</span> <span class="special">;</span>
748<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>
749<span class="identifier">c</span> <span class="special">=</span> <span class="number">4</span> <span class="special">;</span>
750<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>
751</pre>
752 </li>
753</ul></div>
754<p>
755 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
756 </p>
757<a name="reference_optional_operator_move_equal_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
758 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&amp;</span>
759 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">T</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span>
760 <span class="special">)</span> <span class="special">;</span></code>
761 </p></blockquote></div>
762<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
763<li class="listitem">
764 <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>.
765 </li>
766<li class="listitem">
767 <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
768 moved from <code class="computeroutput"><span class="identifier">rhs</span></code>.
769 </li>
770<li class="listitem">
771 <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">&amp;&amp;</span> <span class="special">)</span></code>
772 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="special">&amp;&amp;)</span></code>
773 throws.
774 </li>
775<li class="listitem">
776 <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 move-assignment operator is used,
777 otherwise, its move-constructor is used.
778 </li>
779<li class="listitem">
780 <span class="bold"><strong>Exception Safety:</strong></span> In the event of
781 an exception, the initialization state of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is unchanged and its value unspecified
782 as far as <code class="computeroutput"><span class="identifier">optional</span></code>
783 is concerned (it is up to <code class="computeroutput"><span class="identifier">T</span></code>'s
784 <code class="computeroutput"><span class="keyword">operator</span><span class="special">=()</span></code>).
785 If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
786 is initially uninitialized and <code class="computeroutput"><span class="identifier">T</span></code>'s
787 <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.
788 </li>
789<li class="listitem">
790 <span class="bold"><strong>Example:</strong></span>
791<pre class="programlisting"><span class="identifier">T</span> <span class="identifier">x</span><span class="special">;</span>
792<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">def</span> <span class="special">;</span>
793<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">opt</span><span class="special">(</span><span class="identifier">x</span><span class="special">)</span> <span class="special">;</span>
794
795<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>
796<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>
797<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>
798<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>
799<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>
800</pre>
801 </li>
802</ul></div>
803<p>
804 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
805 </p>
806<div class="blockquote"><blockquote class="blockquote"><p>
807 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;&amp;</span>
808 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">T</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span>
809 <span class="special">)</span> <span class="special">=</span>
810 <span class="keyword">delete</span><span class="special">;</span></code>
811 </p></blockquote></div>
812<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
813 <span class="bold"><strong>Notes:</strong></span> This assignment operator is
814 deleted.
815 </li></ul></div>
816<p>
817 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
818 </p>
819<a name="reference_optional_operator_equal_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
820 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&amp;</span>
821 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">optional</span>
822 <span class="keyword">const</span><span class="special">&amp;</span>
823 <span class="identifier">rhs</span> <span class="special">)</span>
824 <span class="special">;</span></code>
825 </p></blockquote></div>
826<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
827<li class="listitem">
828 <span class="bold"><strong>Requires:</strong></span> <code class="computeroutput"><span class="identifier">T</span></code>
829 is <a href="../../../../../../utility/CopyConstructible.html" target="_top"><code class="computeroutput"><span class="identifier">CopyConstructible</span></code></a> and <code class="computeroutput"><span class="identifier">CopyAssignable</span></code>.
830 </li>
831<li class="listitem">
832<p class="simpara">
833 <span class="bold"><strong>Effects:</strong></span>
834 </p>
835<div class="informaltable"><table class="table">
836<colgroup>
837<col>
838<col>
839<col>
840</colgroup>
841<thead><tr></tr></thead>
842<tbody>
843<tr>
844<td>
845 </td>
846<td>
847 <p>
848 <span class="bold"><strong><code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> contains a value</strong></span>
849 </p>
850 </td>
851<td>
852 <p>
853 <span class="bold"><strong><code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> does not contain a value</strong></span>
854 </p>
855 </td>
856</tr>
857<tr>
858<td>
859 <p>
860 <span class="bold"><strong><code class="computeroutput"><span class="identifier">rhs</span></code>
861 contains a value</strong></span>
862 </p>
863 </td>
864<td>
865 <p>
866 assigns <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code>
867 to the contained value
868 </p>
869 </td>
870<td>
871 <p>
872 initializes the contained value as if direct-initializing
873 an object of type <code class="computeroutput"><span class="identifier">T</span></code>
874 with <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code>
875 </p>
876 </td>
877</tr>
878<tr>
879<td>
880 <p>
881 <span class="bold"><strong><code class="computeroutput"><span class="identifier">rhs</span></code>
882 does not contain a value</strong></span>
883 </p>
884 </td>
885<td>
886 <p>
887 destroys the contained value by calling <code class="computeroutput"><span class="identifier">val</span><span class="special">-&gt;</span><span class="identifier">T</span><span class="special">::~</span><span class="identifier">T</span><span class="special">()</span></code>
888 </p>
889 </td>
890<td>
891 <p>
892 no effect
893 </p>
894 </td>
895</tr>
896</tbody>
897</table></div>
898</li>
899<li class="listitem">
900 <span class="bold"><strong>Returns:</strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>;
901 </li>
902<li class="listitem">
903 <span class="bold"><strong>Postconditions:</strong></span> <code class="computeroutput"><span class="keyword">bool</span><span class="special">(</span><span class="identifier">rhs</span><span class="special">)</span> <span class="special">==</span> <span class="keyword">bool</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span></code>.
904 </li>
905<li class="listitem">
906 <span class="bold"><strong>Exception Safety:</strong></span> If any exception
907 is thrown, the initialization state of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> and <code class="computeroutput"><span class="identifier">rhs</span></code>
908 remains unchanged. If an exception is thrown during the call to <code class="computeroutput"><span class="identifier">T</span></code>'s copy constructor, no effect.
909 If an exception is thrown during the call to <code class="computeroutput"><span class="identifier">T</span></code>'s
910 copy assignment, the state of its contained value is as defined by
911 the exception safety guarantee of <code class="computeroutput"><span class="identifier">T</span></code>'s
912 copy assignment.
913 </li>
914<li class="listitem">
915 <span class="bold"><strong>Example:</strong></span>
916<pre class="programlisting"><span class="identifier">T</span> <span class="identifier">v</span><span class="special">;</span>
917<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">opt</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span>
918<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">def</span> <span class="special">;</span>
919
920<span class="identifier">opt</span> <span class="special">=</span> <span class="identifier">def</span> <span class="special">;</span>
921<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>
922<span class="comment">// previous value (copy of 'v') destroyed from within 'opt'.</span>
923</pre>
924 </li>
925</ul></div>
926<p>
927 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
928 </p>
929<div class="blockquote"><blockquote class="blockquote"><p>
930 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span>
931 <span class="special">&amp;</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rhs</span>
932 <span class="special">)</span> <span class="special">;</span></code>
933 </p></blockquote></div>
934<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
935<li class="listitem">
936 <span class="bold"><strong>Effect:</strong></span> (Re)binds thee wrapped reference.
937 </li>
938<li class="listitem">
939 <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>
940 is initialized and it references the same object referenced by <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code>;
941 otherwise, <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
942 is uninitialized (and references no object).
943 </li>
944<li class="listitem">
945 <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>,
946 <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
947 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>
948 for details on this behavior.
949 </li>
950<li class="listitem">
951 <span class="bold"><strong>Example:</strong></span>
952<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>
953<span class="keyword">int</span> <span class="identifier">b</span> <span class="special">=</span> <span class="number">2</span> <span class="special">;</span>
954<span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">ra</span> <span class="special">=</span> <span class="identifier">a</span> <span class="special">;</span>
955<span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">rb</span> <span class="special">=</span> <span class="identifier">b</span> <span class="special">;</span>
956<span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&amp;&gt;</span> <span class="identifier">def</span> <span class="special">;</span>
957<span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&amp;&gt;</span> <span class="identifier">ora</span><span class="special">(</span><span class="identifier">ra</span><span class="special">)</span> <span class="special">;</span>
958<span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&amp;&gt;</span> <span class="identifier">orb</span><span class="special">(</span><span class="identifier">rb</span><span class="special">)</span> <span class="special">;</span>
959
960<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>
961<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>
962<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>
963<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>
964<span class="keyword">int</span> <span class="identifier">c</span> <span class="special">=</span> <span class="number">3</span><span class="special">;</span>
965<span class="keyword">int</span><span class="special">&amp;</span> <span class="identifier">rc</span> <span class="special">=</span> <span class="identifier">c</span> <span class="special">;</span>
966<span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&amp;&gt;</span> <span class="identifier">orc</span><span class="special">(</span><span class="identifier">rc</span><span class="special">)</span> <span class="special">;</span>
967<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>
968<span class="identifier">c</span> <span class="special">=</span> <span class="number">4</span> <span class="special">;</span>
969<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>
970</pre>
971 </li>
972</ul></div>
973<p>
974 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
975 </p>
976<a name="reference_optional_operator_move_equal_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
977 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&amp;</span>
978 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span>
979 <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>
980 </p></blockquote></div>
981<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
982<li class="listitem">
983 <span class="bold"><strong>Requires:</strong></span> <code class="computeroutput"><span class="identifier">T</span></code>
984 is <code class="computeroutput"><span class="identifier">MoveConstructible</span></code>
985 and <code class="computeroutput"><span class="identifier">MoveAssignable</span></code>.
986 </li>
987<li class="listitem">
988<p class="simpara">
989 <span class="bold"><strong>Effects:</strong></span>
990 </p>
991<div class="informaltable"><table class="table">
992<colgroup>
993<col>
994<col>
995<col>
996</colgroup>
997<thead><tr></tr></thead>
998<tbody>
999<tr>
1000<td>
1001 </td>
1002<td>
1003 <p>
1004 <span class="bold"><strong><code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> contains a value</strong></span>
1005 </p>
1006 </td>
1007<td>
1008 <p>
1009 <span class="bold"><strong><code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> does not contain a value</strong></span>
1010 </p>
1011 </td>
1012</tr>
1013<tr>
1014<td>
1015 <p>
1016 <span class="bold"><strong><code class="computeroutput"><span class="identifier">rhs</span></code>
1017 contains a value</strong></span>
1018 </p>
1019 </td>
1020<td>
1021 <p>
1022 assigns <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(*</span><span class="identifier">rhs</span><span class="special">)</span></code> to the contained value
1023 </p>
1024 </td>
1025<td>
1026 <p>
1027 initializes the contained value as if direct-initializing
1028 an object of type <code class="computeroutput"><span class="identifier">T</span></code>
1029 with <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(*</span><span class="identifier">rhs</span><span class="special">)</span></code>
1030 </p>
1031 </td>
1032</tr>
1033<tr>
1034<td>
1035 <p>
1036 <span class="bold"><strong><code class="computeroutput"><span class="identifier">rhs</span></code>
1037 does not contain a value</strong></span>
1038 </p>
1039 </td>
1040<td>
1041 <p>
1042 destroys the contained value by calling <code class="computeroutput"><span class="identifier">val</span><span class="special">-&gt;</span><span class="identifier">T</span><span class="special">::~</span><span class="identifier">T</span><span class="special">()</span></code>
1043 </p>
1044 </td>
1045<td>
1046 <p>
1047 no effect
1048 </p>
1049 </td>
1050</tr>
1051</tbody>
1052</table></div>
1053</li>
1054<li class="listitem">
1055 <span class="bold"><strong>Returns:</strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>;
1056 </li>
1057<li class="listitem">
1058 <span class="bold"><strong>Postconditions:</strong></span> <code class="computeroutput"><span class="keyword">bool</span><span class="special">(</span><span class="identifier">rhs</span><span class="special">)</span> <span class="special">==</span> <span class="keyword">bool</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span></code>.
1059 </li>
1060<li class="listitem">
1061 <span class="bold"><strong>Remarks:</strong></span> The expression inside <code class="computeroutput"><span class="keyword">noexcept</span></code> is equivalent to <code class="computeroutput"><span class="identifier">is_nothrow_move_constructible</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span> <span class="special">&amp;&amp;</span>
1062 <span class="identifier">is_nothrow_move_assignable</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span></code>.
1063 </li>
1064<li class="listitem">
1065 <span class="bold"><strong>Exception Safety:</strong></span> If any exception
1066 is thrown, the initialization state of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> and <code class="computeroutput"><span class="identifier">rhs</span></code>
1067 remains unchanged. If an exception is thrown during the call to <code class="computeroutput"><span class="identifier">T</span></code>'s move constructor, the state of
1068 <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code>
1069 is determined by the exception safety guarantee of <code class="computeroutput"><span class="identifier">T</span></code>'s
1070 move constructor. If an exception is thrown during the call to T's
1071 move-assignment, the state of <code class="computeroutput"><span class="special">**</span><span class="keyword">this</span></code> and <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code> is determined by the exception
1072 safety guarantee of T's move assignment.
1073 </li>
1074<li class="listitem">
1075 <span class="bold"><strong>Example:</strong></span>
1076<pre class="programlisting"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</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>
1077<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">def</span> <span class="special">;</span>
1078
1079<span class="identifier">opt</span> <span class="special">=</span> <span class="identifier">def</span> <span class="special">;</span>
1080<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">def</span> <span class="special">)</span> <span class="special">;</span>
1081<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">opt</span> <span class="special">)</span> <span class="special">;</span>
1082<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>
1083</pre>
1084 </li>
1085</ul></div>
1086<p>
1087 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
1088 </p>
1089<div class="blockquote"><blockquote class="blockquote"><p>
1090 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span>
1091 <span class="special">&amp;</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;&amp;&amp;</span> <span class="identifier">rhs</span>
1092 <span class="special">)</span> <span class="special">;</span></code>
1093 </p></blockquote></div>
1094<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
1095 <span class="bold"><strong>Effect:</strong></span> Same as <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span>
1096 <span class="keyword">const</span><span class="special">&amp;</span>
1097 <span class="identifier">rhs</span> <span class="special">)</span></code>.
1098 </li></ul></div>
1099<p>
1100 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
1101 </p>
1102<a name="reference_optional_operator_equal_other_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
1103 <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;</span> <span class="identifier">optional</span><span class="special">&amp;</span>
1104 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rhs</span>
1105 <span class="special">)</span> <span class="special">;</span></code>
1106 </p></blockquote></div>
1107<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1108<li class="listitem">
1109<p class="simpara">
1110 <span class="bold"><strong>Effect:</strong></span>
1111 </p>
1112<div class="informaltable"><table class="table">
1113<colgroup>
1114<col>
1115<col>
1116<col>
1117</colgroup>
1118<thead><tr></tr></thead>
1119<tbody>
1120<tr>
1121<td>
1122 </td>
1123<td>
1124 <p>
1125 <span class="bold"><strong><code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> contains a value</strong></span>
1126 </p>
1127 </td>
1128<td>
1129 <p>
1130 <span class="bold"><strong><code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> does not contain a value</strong></span>
1131 </p>
1132 </td>
1133</tr>
1134<tr>
1135<td>
1136 <p>
1137 <span class="bold"><strong><code class="computeroutput"><span class="identifier">rhs</span></code>
1138 contains a value</strong></span>
1139 </p>
1140 </td>
1141<td>
1142 <p>
1143 assigns <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code>
1144 to the contained value
1145 </p>
1146 </td>
1147<td>
1148 <p>
1149 initializes the contained value as if direct-initializing
1150 an object of type <code class="computeroutput"><span class="identifier">T</span></code>
1151 with <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code>
1152 </p>
1153 </td>
1154</tr>
1155<tr>
1156<td>
1157 <p>
1158 <span class="bold"><strong><code class="computeroutput"><span class="identifier">rhs</span></code>
1159 does not contain a value</strong></span>
1160 </p>
1161 </td>
1162<td>
1163 <p>
1164 destroys the contained value by calling <code class="computeroutput"><span class="identifier">val</span><span class="special">-&gt;</span><span class="identifier">T</span><span class="special">::~</span><span class="identifier">T</span><span class="special">()</span></code>
1165 </p>
1166 </td>
1167<td>
1168 <p>
1169 no effect
1170 </p>
1171 </td>
1172</tr>
1173</tbody>
1174</table></div>
1175</li>
1176<li class="listitem">
1177 <span class="bold"><strong>Returns:</strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
1178 </li>
1179<li class="listitem">
1180 <span class="bold"><strong>Postconditions:</strong></span> <code class="computeroutput"><span class="keyword">bool</span><span class="special">(</span><span class="identifier">rhs</span><span class="special">)</span> <span class="special">==</span> <span class="keyword">bool</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span></code>.
1181 </li>
1182<li class="listitem">
1183 <span class="bold"><strong>Exception Safety:</strong></span> If any exception
1184 is thrown, the result of the expression <code class="computeroutput"><span class="keyword">bool</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span></code> remains unchanged. If an exception
1185 is thrown during the call to <code class="computeroutput"><span class="identifier">T</span></code>'s
1186 constructor, no effect. If an exception is thrown during the call to
1187 <code class="computeroutput"><span class="identifier">T</span></code>'s assignment, the
1188 state of its contained value is as defined by the exception safety
1189 guarantee of <code class="computeroutput"><span class="identifier">T</span></code>'s copy
1190 assignment.
1191 </li>
1192<li class="listitem">
1193 <span class="bold"><strong>Example:</strong></span>
1194<pre class="programlisting"><span class="identifier">T</span> <span class="identifier">v</span><span class="special">;</span>
1195<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">opt0</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span>
1196<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;</span> <span class="identifier">opt1</span><span class="special">;</span>
1197
1198<span class="identifier">opt1</span> <span class="special">=</span> <span class="identifier">opt0</span> <span class="special">;</span>
1199<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">&lt;</span><span class="identifier">U</span><span class="special">&gt;(</span><span class="identifier">v</span><span class="special">)</span> <span class="special">)</span> <span class="special">;</span>
1200</pre>
1201 </li>
1202</ul></div>
1203<p>
1204 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
1205 </p>
1206<a name="reference_optional_operator_move_equal_other_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
1207 <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;</span> <span class="identifier">optional</span><span class="special">&amp;</span>
1208 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">rhs</span>
1209 <span class="special">)</span> <span class="special">;</span></code>
1210 </p></blockquote></div>
1211<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1212<li class="listitem">
1213<p class="simpara">
1214 <span class="bold"><strong>Effect:</strong></span>
1215 </p>
1216<div class="informaltable"><table class="table">
1217<colgroup>
1218<col>
1219<col>
1220<col>
1221</colgroup>
1222<thead><tr></tr></thead>
1223<tbody>
1224<tr>
1225<td>
1226 </td>
1227<td>
1228 <p>
1229 <span class="bold"><strong><code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> contains a value</strong></span>
1230 </p>
1231 </td>
1232<td>
1233 <p>
1234 <span class="bold"><strong><code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> does not contain a value</strong></span>
1235 </p>
1236 </td>
1237</tr>
1238<tr>
1239<td>
1240 <p>
1241 <span class="bold"><strong><code class="computeroutput"><span class="identifier">rhs</span></code>
1242 contains a value</strong></span>
1243 </p>
1244 </td>
1245<td>
1246 <p>
1247 assigns <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(*</span><span class="identifier">rhs</span><span class="special">)</span></code> to the contained value
1248 </p>
1249 </td>
1250<td>
1251 <p>
1252 initializes the contained value as if direct-initializing
1253 an object of type <code class="computeroutput"><span class="identifier">T</span></code>
1254 with <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(*</span><span class="identifier">rhs</span><span class="special">)</span></code>
1255 </p>
1256 </td>
1257</tr>
1258<tr>
1259<td>
1260 <p>
1261 <span class="bold"><strong><code class="computeroutput"><span class="identifier">rhs</span></code>
1262 does not contain a value</strong></span>
1263 </p>
1264 </td>
1265<td>
1266 <p>
1267 destroys the contained value by calling <code class="computeroutput"><span class="identifier">val</span><span class="special">-&gt;</span><span class="identifier">T</span><span class="special">::~</span><span class="identifier">T</span><span class="special">()</span></code>
1268 </p>
1269 </td>
1270<td>
1271 <p>
1272 no effect
1273 </p>
1274 </td>
1275</tr>
1276</tbody>
1277</table></div>
1278</li>
1279<li class="listitem">
1280 <span class="bold"><strong>Returns:</strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
1281 </li>
1282<li class="listitem">
1283 <span class="bold"><strong>Postconditions:</strong></span> <code class="computeroutput"><span class="keyword">bool</span><span class="special">(</span><span class="identifier">rhs</span><span class="special">)</span> <span class="special">==</span> <span class="keyword">bool</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span></code>.
1284 </li>
1285<li class="listitem">
1286 <span class="bold"><strong>Exception Safety:</strong></span> If any exception
1287 is thrown, the result of the expression <code class="computeroutput"><span class="keyword">bool</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span></code> remains unchanged. If an exception
1288 is thrown during the call to <code class="computeroutput"><span class="identifier">T</span></code>'s
1289 constructor, no effect. If an exception is thrown during the call to
1290 <code class="computeroutput"><span class="identifier">T</span></code>'s assignment, the
1291 state of its contained value is as defined by the exception safety
1292 guarantee of <code class="computeroutput"><span class="identifier">T</span></code>'s copy
1293 assignment.
1294 </li>
1295<li class="listitem">
1296 <span class="bold"><strong>Example:</strong></span>
1297<pre class="programlisting"><span class="identifier">T</span> <span class="identifier">v</span><span class="special">;</span>
1298<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">opt0</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span>
1299<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;</span> <span class="identifier">opt1</span><span class="special">;</span>
1300
1301<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>
1302<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">opt0</span> <span class="special">);</span>
1303<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">opt1</span> <span class="special">)</span>
1304<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">&lt;</span><span class="identifier">U</span><span class="special">&gt;(</span><span class="identifier">v</span><span class="special">)</span> <span class="special">)</span> <span class="special">;</span>
1305</pre>
1306 </li>
1307</ul></div>
1308<p>
1309 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
1310 </p>
1311<a name="reference_optional_emplace"></a><div class="blockquote"><blockquote class="blockquote"><p>
1312 <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span><span class="special">...</span> <span class="identifier">Args</span><span class="special">&gt;</span>
1313 <span class="keyword">void</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
1314 <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">emplace</span><span class="special">(</span>
1315 <span class="identifier">Args</span><span class="special">...&amp;&amp;</span>
1316 <span class="identifier">args</span> <span class="special">);</span></code>
1317 </p></blockquote></div>
1318<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1319<li class="listitem">
1320 <span class="bold"><strong>Requires:</strong></span> The compiler supports rvalue
1321 references and variadic templates.
1322 </li>
1323<li class="listitem">
1324 <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> <span class="identifier">none</span></code>.
1325 Then initializes in-place the contained value as if direct-initializing
1326 an object of type <code class="computeroutput"><span class="identifier">T</span></code>
1327 with <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">Args</span><span class="special">&gt;(</span><span class="identifier">args</span><span class="special">)...</span></code>.
1328 </li>
1329<li class="listitem">
1330 <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>.
1331 </li>
1332<li class="listitem">
1333 <span class="bold"><strong>Throws:</strong></span> Whatever the selected <code class="computeroutput"><span class="identifier">T</span></code>'s constructor throws.
1334 </li>
1335<li class="listitem">
1336 <span class="bold"><strong>Exception Safety:</strong></span> If an exception
1337 is thrown during the initialization of <code class="computeroutput"><span class="identifier">T</span></code>,
1338 <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1339 is <span class="emphasis"><em>uninitialized</em></span>.
1340 </li>
1341<li class="listitem">
1342 <span class="bold"><strong>Notes:</strong></span> <code class="computeroutput"><span class="identifier">T</span></code>
1343 need not be <code class="computeroutput"><span class="identifier">MoveConstructible</span></code>
1344 or <code class="computeroutput"><span class="identifier">MoveAssignable</span></code>.
1345 On compilers that do not support variadic templates, the signature
1346 falls back to two overloads:<code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span>
1347 <span class="identifier">Arg</span><span class="special">&gt;</span>
1348 <span class="keyword">void</span> <span class="identifier">emplace</span><span class="special">(</span><span class="identifier">Arg</span><span class="special">&amp;&amp;</span> <span class="identifier">arg</span><span class="special">)</span></code> and <code class="computeroutput"><span class="keyword">void</span>
1349 <span class="identifier">emplace</span><span class="special">()</span></code>.
1350 On compilers that do not support rvalue references, the signature falls
1351 back to three overloads: taking <code class="computeroutput"><span class="keyword">const</span></code>
1352 and non-<code class="computeroutput"><span class="keyword">const</span></code> lvalue reference,
1353 and third with empty function argument list.
1354 </li>
1355<li class="listitem">
1356 <span class="bold"><strong>Example:</strong></span>
1357<pre class="programlisting"><span class="identifier">T</span> <span class="identifier">v</span><span class="special">;</span>
1358<span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">opt</span><span class="special">;</span>
1359<span class="identifier">opt</span><span class="special">.</span><span class="identifier">emplace</span><span class="special">(</span><span class="number">0</span><span class="special">);</span> <span class="comment">// create in-place using ctor T(int)</span>
1360<span class="identifier">opt</span><span class="special">.</span><span class="identifier">emplace</span><span class="special">();</span> <span class="comment">// destroy previous and default-construct another T</span>
1361<span class="identifier">opt</span><span class="special">.</span><span class="identifier">emplace</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span> <span class="comment">// destroy and copy-construct in-place (no assignment called)</span>
1362</pre>
1363 </li>
1364</ul></div>
1365<p>
1366 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
1367 </p>
1368<a name="reference_optional_operator_equal_factory"></a><div class="blockquote"><blockquote class="blockquote"><p>
1369 <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="identifier">InPlaceFactory</span><span class="special">&gt;</span>
1370 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&amp;</span>
1371 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">InPlaceFactory</span>
1372 <span class="keyword">const</span><span class="special">&amp;</span>
1373 <span class="identifier">f</span> <span class="special">);</span></code>
1374 </p></blockquote></div>
1375<div class="blockquote"><blockquote class="blockquote"><p>
1376 <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="identifier">TypedInPlaceFactory</span><span class="special">&gt;</span>
1377 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&amp;</span>
1378 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">TypedInPlaceFactory</span>
1379 <span class="keyword">const</span><span class="special">&amp;</span>
1380 <span class="identifier">f</span> <span class="special">);</span></code>
1381 </p></blockquote></div>
1382<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1383<li class="listitem">
1384 <span class="bold"><strong>Effect:</strong></span> Assigns an <code class="computeroutput"><span class="identifier">optional</span></code>
1385 with a value of <code class="computeroutput"><span class="identifier">T</span></code> obtained
1386 from the factory.
1387 </li>
1388<li class="listitem">
1389 <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>
1390 and its value is <span class="emphasis"><em>directly given</em></span> from the factory
1391 <code class="computeroutput"><span class="identifier">f</span></code> (i.e., the value
1392 <span class="underline">is not copied</span>).
1393 </li>
1394<li class="listitem">
1395 <span class="bold"><strong>Throws:</strong></span> Whatever the <code class="computeroutput"><span class="identifier">T</span></code> constructor called by the factory
1396 throws.
1397 </li>
1398<li class="listitem">
1399 <span class="bold"><strong>Notes:</strong></span> See <a class="link" href="../../tutorial/in_place_factories.html" title="In-Place Factories">In-Place
1400 Factories</a>
1401 </li>
1402<li class="listitem">
1403 <span class="bold"><strong>Exception Safety:</strong></span> Exceptions can only
1404 be thrown during the call to the <code class="computeroutput"><span class="identifier">T</span></code>
1405 constructor used by the factory; in that case, the <code class="computeroutput"><span class="identifier">optional</span></code>
1406 object will be reset to be <span class="emphasis"><em>uninitialized</em></span>.
1407 </li>
1408</ul></div>
1409<p>
1410 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
1411 </p>
1412<a name="reference_optional_reset_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
1413 <code class="computeroutput"><span class="keyword">void</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
1414 <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">reset</span><span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span></code>
1415 </p></blockquote></div>
1416<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
1417 <span class="bold"><strong>Deprecated:</strong></span> same as <code class="computeroutput"><span class="keyword">operator</span><span class="special">=</span>
1418 <span class="special">(</span> <span class="identifier">T</span>
1419 <span class="keyword">const</span><span class="special">&amp;</span>
1420 <span class="identifier">v</span><span class="special">)</span>
1421 <span class="special">;</span></code>
1422 </li></ul></div>
1423<p>
1424 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
1425 </p>
1426<a name="reference_optional_reset"></a><div class="blockquote"><blockquote class="blockquote"><p>
1427 <code class="computeroutput"><span class="keyword">void</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">reset</span><span class="special">()</span> <span class="keyword">noexcept</span>
1428 <span class="special">;</span></code>
1429 </p></blockquote></div>
1430<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
1431 <span class="bold"><strong>Deprecated:</strong></span> Same as <code class="computeroutput"><span class="keyword">operator</span><span class="special">=(</span>
1432 <span class="identifier">none_t</span> <span class="special">);</span></code>
1433 </li></ul></div>
1434<p>
1435 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
1436 </p>
1437<a name="reference_optional_get"></a><div class="blockquote"><blockquote class="blockquote"><p>
1438 <code class="computeroutput"><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
1439 <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">get</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">;</span></code>
1440 </p></blockquote></div>
1441<div class="blockquote"><blockquote class="blockquote"><p>
1442 <code class="computeroutput"><span class="identifier">T</span><span class="special">&amp;</span>
1443 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">get</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>
1447 <span class="keyword">const</span><span class="special">&amp;</span>
1448 <span class="identifier">get</span> <span class="special">(</span>
1449 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">)</span> <span class="special">;</span></code>
1450 </p></blockquote></div>
1451<div class="blockquote"><blockquote class="blockquote"><p>
1452 <code class="computeroutput"><span class="keyword">inline</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">get</span>
1453 <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
1454 <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;</span>
1455 <span class="special">&amp;)</span> <span class="special">;</span></code>
1456 </p></blockquote></div>
1457<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1458<li class="listitem">
1459 <span class="bold"><strong>Requires:</strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is initialized
1460 </li>
1461<li class="listitem">
1462 <span class="bold"><strong>Returns:</strong></span> A reference to the contained
1463 value
1464 </li>
1465<li class="listitem">
1466 <span class="bold"><strong>Throws:</strong></span> Nothing.
1467 </li>
1468<li class="listitem">
1469 <span class="bold"><strong>Notes:</strong></span> The requirement is asserted
1470 via <code class="computeroutput"><span class="identifier">BOOST_ASSERT</span><span class="special">()</span></code>.
1471 </li>
1472</ul></div>
1473<p>
1474 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
1475 </p>
1476<div class="blockquote"><blockquote class="blockquote"><p>
1477 <code class="computeroutput"><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;::</span><span class="identifier">get</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">;</span></code>
1478 </p></blockquote></div>
1479<div class="blockquote"><blockquote class="blockquote"><p>
1480 <code class="computeroutput"><span class="identifier">T</span><span class="special">&amp;</span>
1481 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;::</span><span class="identifier">get</span><span class="special">()</span> <span class="special">;</span></code>
1482 </p></blockquote></div>
1483<div class="blockquote"><blockquote class="blockquote"><p>
1484 <code class="computeroutput"><span class="keyword">inline</span> <span class="identifier">T</span>
1485 <span class="keyword">const</span><span class="special">&amp;</span>
1486 <span class="identifier">get</span> <span class="special">(</span>
1487 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span>
1488 <span class="keyword">const</span><span class="special">&amp;</span>
1489 <span class="special">)</span> <span class="special">;</span></code>
1490 </p></blockquote></div>
1491<div class="blockquote"><blockquote class="blockquote"><p>
1492 <code class="computeroutput"><span class="keyword">inline</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">get</span>
1493 <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span> <span class="special">&amp;)</span>
1494 <span class="special">;</span></code>
1495 </p></blockquote></div>
1496<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1497<li class="listitem">
1498 <span class="bold"><strong>Requires: </strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is initialized
1499 </li>
1500<li class="listitem">
1501 <span class="bold"><strong>Returns:</strong></span> <span class="underline">The</span>
1502 reference contained.
1503 </li>
1504<li class="listitem">
1505 <span class="bold"><strong>Throws:</strong></span> Nothing.
1506 </li>
1507<li class="listitem">
1508 <span class="bold"><strong>Notes:</strong></span> The requirement is asserted
1509 via <code class="computeroutput"><span class="identifier">BOOST_ASSERT</span><span class="special">()</span></code>.
1510 </li>
1511</ul></div>
1512<p>
1513 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
1514 </p>
1515<a name="reference_optional_operator_asterisk"></a><div class="blockquote"><blockquote class="blockquote"><p>
1516 <code class="computeroutput"><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
1517 <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">*()</span>
1518 <span class="keyword">const</span><span class="special">&amp;</span>
1519 <span class="special">;</span></code>
1520 </p></blockquote></div>
1521<div class="blockquote"><blockquote class="blockquote"><p>
1522 <code class="computeroutput"><span class="identifier">T</span><span class="special">&amp;</span>
1523 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">*()</span> <span class="special">&amp;;</span></code>
1524 </p></blockquote></div>
1525<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1526<li class="listitem">
1527 <span class="bold"><strong>Requires:</strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is initialized
1528 </li>
1529<li class="listitem">
1530 <span class="bold"><strong>Returns:</strong></span> A reference to the contained
1531 value
1532 </li>
1533<li class="listitem">
1534 <span class="bold"><strong>Throws:</strong></span> Nothing.
1535 </li>
1536<li class="listitem">
1537 <span class="bold"><strong>Notes:</strong></span> The requirement is asserted
1538 via <code class="computeroutput"><span class="identifier">BOOST_ASSERT</span><span class="special">()</span></code>.
1539 On compilers that do not support ref-qualifiers on member functions
1540 these two overloads are replaced with the classical two: a <code class="computeroutput"><span class="keyword">const</span></code> and non-<code class="computeroutput"><span class="keyword">const</span></code>
1541 member functions.
1542 </li>
1543<li class="listitem">
1544 <span class="bold"><strong>Example:</strong></span>
1545<pre class="programlisting"><span class="identifier">T</span> <span class="identifier">v</span> <span class="special">;</span>
1546<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">opt</span> <span class="special">(</span> <span class="identifier">v</span> <span class="special">);</span>
1547<span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">u</span> <span class="special">=</span> <span class="special">*</span><span class="identifier">opt</span><span class="special">;</span>
1548<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>
1549<span class="identifier">T</span> <span class="identifier">w</span> <span class="special">;</span>
1550<span class="special">*</span><span class="identifier">opt</span> <span class="special">=</span> <span class="identifier">w</span> <span class="special">;</span>
1551<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>
1552</pre>
1553 </li>
1554</ul></div>
1555<p>
1556 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
1557 </p>
1558<a name="reference_optional_operator_asterisk_move"></a><div class="blockquote"><blockquote class="blockquote"><p>
1559 <code class="computeroutput"><span class="identifier">T</span><span class="special">&amp;&amp;</span>
1560 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">*()</span> <span class="special">&amp;&amp;;</span></code>
1561 </p></blockquote></div>
1562<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1563<li class="listitem">
1564 <span class="bold"><strong>Requires:</strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> contains a value.
1565 </li>
1566<li class="listitem">
1567 <span class="bold"><strong>Effects:</strong></span> Equivalent to <code class="computeroutput"><span class="keyword">return</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(*</span><span class="identifier">val</span><span class="special">);</span></code>.
1568 </li>
1569<li class="listitem">
1570 <span class="bold"><strong>Notes:</strong></span> The requirement is asserted
1571 via <code class="computeroutput"><span class="identifier">BOOST_ASSERT</span><span class="special">()</span></code>.
1572 On compilers that do not support ref-qualifiers on member functions
1573 this overload is not present.
1574 </li>
1575</ul></div>
1576<p>
1577 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
1578 </p>
1579<div class="blockquote"><blockquote class="blockquote"><p>
1580 <code class="computeroutput"><span class="identifier">T</span> <span class="special">&amp;</span>
1581 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;::</span><span class="keyword">operator</span><span class="special">*()</span>
1582 <span class="keyword">const</span><span class="special">&amp;</span>
1583 <span class="special">;</span></code>
1584 </p></blockquote></div>
1585<div class="blockquote"><blockquote class="blockquote"><p>
1586 <code class="computeroutput"><span class="identifier">T</span> <span class="special">&amp;</span>
1587 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;::</span><span class="keyword">operator</span><span class="special">*()</span>
1588 <span class="special">&amp;</span> <span class="special">;</span></code>
1589 </p></blockquote></div>
1590<div class="blockquote"><blockquote class="blockquote"><p>
1591 <code class="computeroutput"><span class="identifier">T</span> <span class="special">&amp;</span>
1592 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;::</span><span class="keyword">operator</span><span class="special">*()</span>
1593 <span class="special">&amp;&amp;</span> <span class="special">;</span></code>
1594 </p></blockquote></div>
1595<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1596<li class="listitem">
1597 <span class="bold"><strong>Requires: </strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is initialized
1598 </li>
1599<li class="listitem">
1600 <span class="bold"><strong>Returns:</strong></span> <span class="underline">The</span>
1601 reference contained.
1602 </li>
1603<li class="listitem">
1604 <span class="bold"><strong>Throws:</strong></span> Nothing.
1605 </li>
1606<li class="listitem">
1607 <span class="bold"><strong>Notes:</strong></span> The requirement is asserted
1608 via <code class="computeroutput"><span class="identifier">BOOST_ASSERT</span><span class="special">()</span></code>.
1609 On compilers that do not support ref-qualifiers on member functions
1610 these three overloads are replaced with the classical two: a <code class="computeroutput"><span class="keyword">const</span></code> and non-<code class="computeroutput"><span class="keyword">const</span></code>
1611 member functions.
1612 </li>
1613<li class="listitem">
1614 <span class="bold"><strong>Example:</strong></span>
1615<pre class="programlisting"><span class="identifier">T</span> <span class="identifier">v</span> <span class="special">;</span>
1616<span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">vref</span> <span class="special">=</span> <span class="identifier">v</span> <span class="special">;</span>
1617<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span> <span class="identifier">opt</span> <span class="special">(</span> <span class="identifier">vref</span> <span class="special">);</span>
1618<span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">vref2</span> <span class="special">=</span> <span class="special">*</span><span class="identifier">opt</span><span class="special">;</span>
1619<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>
1620<span class="special">++</span> <span class="identifier">v</span> <span class="special">;</span>
1621<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>
1622</pre>
1623 </li>
1624</ul></div>
1625<p>
1626 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
1627 </p>
1628<a name="reference_optional_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
1629 <code class="computeroutput"><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">()</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">;</span></code>
1630 </p></blockquote></div>
1631<div class="blockquote"><blockquote class="blockquote"><p>
1632 <code class="computeroutput"><span class="identifier">T</span><span class="special">&amp;</span>
1633 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">()</span> <span class="special">&amp;</span> <span class="special">;</span></code>
1634 </p></blockquote></div>
1635<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1636<li class="listitem">
1637 <span class="bold"><strong>Effects:</strong></span> Equivalent to <code class="computeroutput"><span class="keyword">return</span> <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="identifier">val</span> <span class="special">:</span> <span class="keyword">throw</span> <span class="identifier">bad_optional_access</span><span class="special">();</span></code>.
1638 </li>
1639<li class="listitem">
1640 <span class="bold"><strong>Notes:</strong></span> On compilers that do not support
1641 ref-qualifiers on member functions these two overloads are replaced
1642 with the classical two: a <code class="computeroutput"><span class="keyword">const</span></code>
1643 and non-<code class="computeroutput"><span class="keyword">const</span></code> member functions.
1644 </li>
1645<li class="listitem">
1646 <span class="bold"><strong>Example:</strong></span>
1647<pre class="programlisting"><span class="identifier">T</span> <span class="identifier">v</span> <span class="special">;</span>
1648<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</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>
1649<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>
1650
1651<span class="keyword">try</span> <span class="special">{</span>
1652 <span class="identifier">o0</span><span class="special">.</span><span class="identifier">value</span><span class="special">();</span> <span class="comment">// throws</span>
1653 <span class="identifier">assert</span> <span class="special">(</span> <span class="keyword">false</span> <span class="special">);</span>
1654<span class="special">}</span>
1655<span class="keyword">catch</span><span class="special">(</span><span class="identifier">bad_optional_access</span><span class="special">&amp;)</span> <span class="special">{</span>
1656 <span class="identifier">assert</span> <span class="special">(</span> <span class="keyword">true</span> <span class="special">);</span>
1657<span class="special">}</span>
1658</pre>
1659 </li>
1660</ul></div>
1661<p>
1662 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
1663 </p>
1664<a name="reference_optional_value_move"></a><div class="blockquote"><blockquote class="blockquote"><p>
1665 <code class="computeroutput"><span class="identifier">T</span><span class="special">&amp;&amp;</span>
1666 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">()</span> <span class="special">&amp;&amp;</span> <span class="special">;</span></code>
1667 </p></blockquote></div>
1668<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1669<li class="listitem">
1670 <span class="bold"><strong>Effects:</strong></span> Equivalent to <code class="computeroutput"><span class="keyword">return</span> <span class="keyword">bool</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</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">val</span><span class="special">)</span> <span class="special">:</span> <span class="keyword">throw</span> <span class="identifier">bad_optional_access</span><span class="special">();</span></code>.
1671 </li>
1672<li class="listitem">
1673 <span class="bold"><strong>Notes:</strong></span> On compilers that do not support
1674 ref-qualifiers on member functions this overload is not present.
1675 </li>
1676</ul></div>
1677<p>
1678 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
1679 </p>
1680<a name="reference_optional_value_or"></a><div class="blockquote"><blockquote class="blockquote"><p>
1681 <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">&gt;</span> <span class="identifier">T</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value_or</span><span class="special">(</span><span class="identifier">U</span> <span class="special">&amp;&amp;</span>
1682 <span class="identifier">v</span><span class="special">)</span>
1683 <span class="keyword">const</span><span class="special">&amp;</span>
1684 <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>Effects:</strong></span> Equivalent to <code class="computeroutput"><span class="keyword">if</span> <span class="special">(*</span><span class="keyword">this</span><span class="special">)</span> <span class="keyword">return</span> <span class="special">**</span><span class="keyword">this</span><span class="special">;</span> <span class="keyword">else</span> <span class="keyword">return</span>
1689 <span class="identifier">std</span><span class="special">::</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;(</span><span class="identifier">v</span><span class="special">);</span></code>.
1690 </li>
1691<li class="listitem">
1692 <span class="bold"><strong>Remarks:</strong></span> If <code class="computeroutput"><span class="identifier">T</span></code>
1693 is not <a href="../../../../../../utility/CopyConstructible.html" target="_top"><code class="computeroutput"><span class="identifier">CopyConstructible</span></code></a> or <code class="computeroutput"><span class="identifier">U</span> <span class="special">&amp;&amp;</span></code>
1694 is not convertible to <code class="computeroutput"><span class="identifier">T</span></code>,
1695 the program is ill-formed.
1696 </li>
1697<li class="listitem">
1698 <span class="bold"><strong>Notes:</strong></span> On compilers that do not support
1699 ref-qualifiers on member functions this overload is replaced with the
1700 <code class="computeroutput"><span class="keyword">const</span></code>-qualified member
1701 function. On compilers without rvalue reference support the type of
1702 <code class="computeroutput"><span class="identifier">v</span></code> becomes <code class="computeroutput"><span class="identifier">U</span> <span class="keyword">const</span><span class="special">&amp;</span></code>.
1703 </li>
1704</ul></div>
1705<p>
1706 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
1707 </p>
1708<a name="reference_optional_value_or_move"></a><div class="blockquote"><blockquote class="blockquote"><p>
1709 <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">&gt;</span> <span class="identifier">T</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value_or</span><span class="special">(</span><span class="identifier">U</span> <span class="special">&amp;&amp;</span>
1710 <span class="identifier">v</span><span class="special">)</span>
1711 <span class="special">&amp;&amp;</span> <span class="special">;</span></code>
1712 </p></blockquote></div>
1713<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1714<li class="listitem">
1715 <span class="bold"><strong>Effects:</strong></span> Equivalent to <code class="computeroutput"><span class="keyword">if</span> <span class="special">(*</span><span class="keyword">this</span><span class="special">)</span> <span class="keyword">return</span> <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="keyword">else</span> <span class="keyword">return</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;(</span><span class="identifier">v</span><span class="special">);</span></code>.
1716 </li>
1717<li class="listitem">
1718 <span class="bold"><strong>Remarks:</strong></span> If <code class="computeroutput"><span class="identifier">T</span></code>
1719 is not <code class="computeroutput"><span class="identifier">MoveConstructible</span></code>
1720 or <code class="computeroutput"><span class="identifier">U</span> <span class="special">&amp;&amp;</span></code>
1721 is not convertible to <code class="computeroutput"><span class="identifier">T</span></code>,
1722 the program is ill-formed.
1723 </li>
1724<li class="listitem">
1725 <span class="bold"><strong>Notes:</strong></span> On compilers that do not support
1726 ref-qualifiers on member functions this overload is not present.
1727 </li>
1728</ul></div>
1729<p>
1730 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
1731 </p>
1732<a name="reference_optional_value_or_call"></a><div class="blockquote"><blockquote class="blockquote"><p>
1733 <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">&gt;</span> <span class="identifier">T</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value_or_eval</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">)</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">;</span></code>
1734 </p></blockquote></div>
1735<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1736<li class="listitem">
1737 <span class="bold"><strong>Requires:</strong></span> <code class="computeroutput"><span class="identifier">T</span></code>
1738 is <a href="../../../../../../utility/CopyConstructible.html" target="_top"><code class="computeroutput"><span class="identifier">CopyConstructible</span></code></a> and <code class="computeroutput"><span class="identifier">F</span></code> models a <a href="http://www.sgi.com/tech/stl/Generator.html" target="_top"><code class="computeroutput"><span class="identifier">Generator</span></code></a> whose result type
1739 is convertible to <code class="computeroutput"><span class="identifier">T</span></code>.
1740 </li>
1741<li class="listitem">
1742 <span class="bold"><strong>Effects:</strong></span> <code class="computeroutput"><span class="keyword">if</span>
1743 <span class="special">(*</span><span class="keyword">this</span><span class="special">)</span> <span class="keyword">return</span> <span class="special">**</span><span class="keyword">this</span><span class="special">;</span> <span class="keyword">else</span> <span class="keyword">return</span> <span class="identifier">f</span><span class="special">();</span></code>.
1744 </li>
1745<li class="listitem">
1746 <span class="bold"><strong>Notes:</strong></span> On compilers that do not support
1747 ref-qualifiers on member functions this overload is replaced with the
1748 <code class="computeroutput"><span class="keyword">const</span></code>-qualified member
1749 function.
1750 </li>
1751<li class="listitem">
1752 <span class="bold"><strong>Example:</strong></span>
1753<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">complain_and_0</span><span class="special">()</span>
1754<span class="special">{</span>
1755 <span class="identifier">clog</span> <span class="special">&lt;&lt;</span> <span class="string">"no value returned, using default"</span> <span class="special">&lt;&lt;</span> <span class="identifier">endl</span><span class="special">;</span>
1756 <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
1757<span class="special">}</span>
1758
1759<span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">o1</span> <span class="special">=</span> <span class="number">1</span><span class="special">;</span>
1760<span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">oN</span> <span class="special">=</span> <span class="identifier">none</span><span class="special">;</span>
1761
1762<span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">o1</span><span class="special">.</span><span class="identifier">value_or_eval</span><span class="special">(</span><span class="identifier">complain_and_0</span><span class="special">);</span> <span class="comment">// fun not called</span>
1763<span class="identifier">assert</span> <span class="special">(</span><span class="identifier">i</span> <span class="special">==</span> <span class="number">1</span><span class="special">);</span>
1764
1765<span class="keyword">int</span> <span class="identifier">j</span> <span class="special">=</span> <span class="identifier">oN</span><span class="special">.</span><span class="identifier">value_or_eval</span><span class="special">(</span><span class="identifier">complain_and_0</span><span class="special">);</span> <span class="comment">// fun called</span>
1766<span class="identifier">assert</span> <span class="special">(</span><span class="identifier">i</span> <span class="special">==</span> <span class="number">0</span><span class="special">);</span>
1767</pre>
1768 </li>
1769</ul></div>
1770<p>
1771 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
1772 </p>
1773<a name="reference_optional_value_or_call_move"></a><div class="blockquote"><blockquote class="blockquote"><p>
1774 <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">&gt;</span> <span class="identifier">T</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value_or_eval</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">)</span> <span class="special">&amp;&amp;</span>
1775 <span class="special">;</span></code>
1776 </p></blockquote></div>
1777<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1778<li class="listitem">
1779 <span class="bold"><strong>Requires:</strong></span> <code class="computeroutput"><span class="identifier">T</span></code>
1780 is <code class="computeroutput"><span class="identifier">MoveConstructible</span></code>
1781 and <code class="computeroutput"><span class="identifier">F</span></code> models a <a href="http://www.sgi.com/tech/stl/Generator.html" target="_top"><code class="computeroutput"><span class="identifier">Generator</span></code></a>
1782 whose result type is convertible to <code class="computeroutput"><span class="identifier">T</span></code>.
1783 </li>
1784<li class="listitem">
1785 <span class="bold"><strong>Effects:</strong></span> <code class="computeroutput"><span class="keyword">if</span>
1786 <span class="special">(*</span><span class="keyword">this</span><span class="special">)</span> <span class="keyword">return</span> <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="keyword">else</span> <span class="keyword">return</span>
1787 <span class="identifier">f</span><span class="special">();</span></code>.
1788 </li>
1789<li class="listitem">
1790 <span class="bold"><strong>Notes:</strong></span> On compilers that do not support
1791 ref-qualifiers on member functions this overload is not present.
1792 </li>
1793</ul></div>
1794<p>
1795 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
1796 </p>
1797<a name="reference_optional_get_value_or_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
1798 <code class="computeroutput"><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
1799 <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">get_value_or</span><span class="special">(</span>
1800 <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="keyword">default</span><span class="special">)</span> <span class="keyword">const</span> <span class="special">;</span></code>
1801 </p></blockquote></div>
1802<div class="blockquote"><blockquote class="blockquote"><p>
1803 <code class="computeroutput"><span class="identifier">T</span><span class="special">&amp;</span>
1804 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">get_value_or</span><span class="special">(</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="keyword">default</span>
1805 <span class="special">)</span> <span class="special">;</span></code>
1806 </p></blockquote></div>
1807<div class="blockquote"><blockquote class="blockquote"><p>
1808 <code class="computeroutput"><span class="keyword">inline</span> <span class="identifier">T</span>
1809 <span class="keyword">const</span><span class="special">&amp;</span>
1810 <span class="identifier">get_optional_value_or</span> <span class="special">(</span>
1811 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">o</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="keyword">default</span> <span class="special">)</span> <span class="special">;</span></code>
1812 </p></blockquote></div>
1813<div class="blockquote"><blockquote class="blockquote"><p>
1814 <code class="computeroutput"><span class="keyword">inline</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">get_optional_value_or</span>
1815 <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
1816 <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;&amp;</span>
1817 <span class="identifier">o</span><span class="special">,</span>
1818 <span class="identifier">T</span><span class="special">&amp;</span>
1819 <span class="keyword">default</span> <span class="special">)</span>
1820 <span class="special">;</span></code>
1821 </p></blockquote></div>
1822<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1823<li class="listitem">
1824 <span class="bold"><strong>Deprecated:</strong></span> Use <code class="computeroutput"><span class="identifier">value_or</span><span class="special">()</span></code> instead.
1825 </li>
1826<li class="listitem">
1827 <span class="bold"><strong>Returns:</strong></span> A reference to the contained
1828 value, if any, or <code class="computeroutput"><span class="keyword">default</span></code>.
1829 </li>
1830<li class="listitem">
1831 <span class="bold"><strong>Throws:</strong></span> Nothing.
1832 </li>
1833<li class="listitem">
1834 <span class="bold"><strong>Example:</strong></span>
1835<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>
1836<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">def</span><span class="special">;</span>
1837<span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</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>
1838<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>
1839
1840<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">opt</span> <span class="special">(</span> <span class="identifier">v</span> <span class="special">);</span>
1841<span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</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>
1842<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>
1843<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>
1844</pre>
1845 </li>
1846</ul></div>
1847<p>
1848 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
1849 </p>
1850<a name="reference_optional_get_ptr"></a><div class="blockquote"><blockquote class="blockquote"><p>
1851 <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">&lt;</span><span class="identifier">T</span></code>
1852 <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">get_ptr</span><span class="special">()</span>
1853 <span class="keyword">const</span> <span class="special">;</span></code>
1854 </p></blockquote></div>
1855<div class="blockquote"><blockquote class="blockquote"><p>
1856 <code class="computeroutput"><span class="identifier">T</span><span class="special">*</span>
1857 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">get_ptr</span><span class="special">()</span> <span class="special">;</span></code>
1858 </p></blockquote></div>
1859<div class="blockquote"><blockquote class="blockquote"><p>
1860 <code class="computeroutput"><span class="keyword">inline</span> <span class="identifier">T</span>
1861 <span class="keyword">const</span><span class="special">*</span>
1862 <span class="identifier">get_pointer</span> <span class="special">(</span>
1863 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">)</span> <span class="special">;</span></code>
1864 </p></blockquote></div>
1865<div class="blockquote"><blockquote class="blockquote"><p>
1866 <code class="computeroutput"><span class="keyword">inline</span> <span class="identifier">T</span><span class="special">*</span> <span class="identifier">get_pointer</span>
1867 <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
1868 <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;</span>
1869 <span class="special">&amp;)</span> <span class="special">;</span></code>
1870 </p></blockquote></div>
1871<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1872<li class="listitem">
1873 <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
1874 contained value; else <code class="computeroutput"><span class="number">0</span></code>
1875 (<span class="emphasis"><em>null</em></span>).
1876 </li>
1877<li class="listitem">
1878 <span class="bold"><strong>Throws:</strong></span> Nothing.
1879 </li>
1880<li class="listitem">
1881 <span class="bold"><strong>Notes:</strong></span> The contained value is permanently
1882 stored within <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
1883 so you should not hold nor delete this pointer
1884 </li>
1885<li class="listitem">
1886 <span class="bold"><strong>Example:</strong></span>
1887<pre class="programlisting"><span class="identifier">T</span> <span class="identifier">v</span><span class="special">;</span>
1888<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">opt</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span>
1889<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span> <span class="identifier">copt</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span>
1890<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>
1891<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>
1892<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>
1893<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>
1894</pre>
1895 </li>
1896</ul></div>
1897<p>
1898 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
1899 </p>
1900<a name="reference_optional_operator_arrow"></a><div class="blockquote"><blockquote class="blockquote"><p>
1901 <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">&lt;</span><span class="identifier">T</span></code>
1902 <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="keyword">operator</span> <span class="special">-&gt;()</span>
1903 <span class="keyword">const</span> <span class="special">;</span></code>
1904 </p></blockquote></div>
1905<div class="blockquote"><blockquote class="blockquote"><p>
1906 <code class="computeroutput"><span class="identifier">T</span><span class="special">*</span>
1907 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="keyword">operator</span>
1908 <span class="special">-&gt;()</span> <span class="special">;</span></code>
1909 </p></blockquote></div>
1910<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1911<li class="listitem">
1912 <span class="bold"><strong>Requires: </strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is initialized.
1913 </li>
1914<li class="listitem">
1915 <span class="bold"><strong>Returns:</strong></span> A pointer to the contained
1916 value.
1917 </li>
1918<li class="listitem">
1919 <span class="bold"><strong>Throws:</strong></span> Nothing.
1920 </li>
1921<li class="listitem">
1922 <span class="bold"><strong>Notes:</strong></span> The requirement is asserted
1923 via <code class="computeroutput"><span class="identifier">BOOST_ASSERT</span><span class="special">()</span></code>.
1924 </li>
1925<li class="listitem">
1926 <span class="bold"><strong>Example:</strong></span>
1927<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>
1928<span class="identifier">X</span> <span class="identifier">x</span> <span class="special">;</span>
1929<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">X</span><span class="special">&gt;</span> <span class="identifier">opt</span> <span class="special">(</span><span class="identifier">x</span><span class="special">);</span>
1930<span class="identifier">opt</span><span class="special">-&gt;</span><span class="identifier">mdata</span> <span class="special">=</span> <span class="number">2</span> <span class="special">;</span>
1931</pre>
1932 </li>
1933</ul></div>
1934<p>
1935 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
1936 </p>
1937<a name="reference_optional_operator_bool"></a><div class="blockquote"><blockquote class="blockquote"><p>
1938 <code class="computeroutput"><span class="keyword">explicit</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="keyword">operator</span>
1939 <span class="keyword">bool</span><span class="special">()</span>
1940 <span class="keyword">const</span> <span class="keyword">noexcept</span>
1941 <span class="special">;</span></code>
1942 </p></blockquote></div>
1943<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1944<li class="listitem">
1945 <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>.
1946 </li>
1947<li class="listitem">
1948 <span class="bold"><strong>Notes:</strong></span> On compilers that do not support
1949 explicit conversion operators this falls back to safe-bool idiom.
1950 </li>
1951<li class="listitem">
1952 <span class="bold"><strong>Example:</strong></span>
1953<pre class="programlisting"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">def</span> <span class="special">;</span>
1954<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>
1955<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">opt</span> <span class="special">(</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span>
1956<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">opt</span> <span class="special">);</span>
1957<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>
1958</pre>
1959 </li>
1960</ul></div>
1961<p>
1962 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
1963 </p>
1964<a name="reference_optional_operator_not"></a><div class="blockquote"><blockquote class="blockquote"><p>
1965 <code class="computeroutput"><span class="keyword">bool</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">!()</span> <span class="keyword">noexcept</span>
1966 <span class="special">;</span></code>
1967 </p></blockquote></div>
1968<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1969<li class="listitem">
1970 <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>; else <code class="computeroutput"><span class="keyword">false</span></code>.
1971 </li>
1972<li class="listitem">
1973 <span class="bold"><strong>Notes:</strong></span> This operator is provided for
1974 those compilers which can't use the <span class="emphasis"><em>unspecified-bool-type
1975 operator</em></span> in certain boolean contexts.
1976 </li>
1977<li class="listitem">
1978 <span class="bold"><strong>Example:</strong></span>
1979<pre class="programlisting"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">opt</span> <span class="special">;</span>
1980<span class="identifier">assert</span> <span class="special">(</span> <span class="special">!</span><span class="identifier">opt</span> <span class="special">);</span>
1981<span class="special">*</span><span class="identifier">opt</span> <span class="special">=</span> <span class="identifier">some_T</span> <span class="special">;</span>
1982
1983<span class="comment">// Notice the "double-bang" idiom here.</span>
1984<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>
1985</pre>
1986 </li>
1987</ul></div>
1988<p>
1989 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
1990 </p>
1991<a name="reference_optional_is_initialized"></a><div class="blockquote"><blockquote class="blockquote"><p>
1992 <code class="computeroutput"><span class="keyword">bool</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">is_initialized</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">;</span></code>
1993 </p></blockquote></div>
1994<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
1995 <span class="bold"><strong>Deprecated:</strong></span> Same as <code class="computeroutput"><span class="keyword">explicit</span> <span class="keyword">operator</span>
1996 <span class="keyword">bool</span> <span class="special">()</span>
1997 <span class="special">;</span></code>
1998 </li></ul></div>
1999<p>
2000 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
2001 </p>
2002<h6>
2003<a name="boost_optional.reference.header__boost_optional_optional_hpp_.detailed_semantics.h1"></a>
2004 <span class="phrase"><a name="boost_optional.reference.header__boost_optional_optional_hpp_.detailed_semantics.free_functions"></a></span><a class="link" href="detailed_semantics.html#boost_optional.reference.header__boost_optional_optional_hpp_.detailed_semantics.free_functions">Free
2005 functions</a>
2006 </h6>
2007<p>
2008 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
2009 </p>
2010<a name="reference_make_optional_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
2011 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;</span> <span class="identifier">make_optional</span><span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">v</span> <span class="special">)</span></code>
2012 </p></blockquote></div>
2013<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
2014<li class="listitem">
2015 <span class="bold"><strong>Returns: </strong></span> <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;(</span><span class="identifier">v</span><span class="special">)</span></code> for the <span class="emphasis"><em>deduced</em></span>
2016 type <code class="computeroutput"><span class="identifier">T</span></code> of <code class="computeroutput"><span class="identifier">v</span></code>.
2017 </li>
2018<li class="listitem">
2019 <span class="bold"><strong>Example:</strong></span>
2020<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">void</span> <span class="identifier">foo</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">opt</span> <span class="special">)</span> <span class="special">;</span>
2021
2022<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&lt;int&gt;</span>
2023</pre>
2024 </li>
2025</ul></div>
2026<p>
2027 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
2028 </p>
2029<a name="reference_make_optional_bool_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
2030 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;</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>
2031 <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">v</span> <span class="special">)</span></code>
2032 </p></blockquote></div>
2033<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
2034<li class="listitem">
2035 <span class="bold"><strong>Returns: </strong></span> <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;(</span><span class="identifier">condition</span><span class="special">,</span><span class="identifier">v</span><span class="special">)</span></code> for the <span class="emphasis"><em>deduced</em></span>
2036 type <code class="computeroutput"><span class="identifier">T</span></code> of <code class="computeroutput"><span class="identifier">v</span></code>.
2037 </li>
2038<li class="listitem">
2039 <span class="bold"><strong>Example:</strong></span>
2040<pre class="programlisting"><span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&gt;</span> <span class="identifier">calculate_foo</span><span class="special">()</span>
2041<span class="special">{</span>
2042 <span class="keyword">double</span> <span class="identifier">val</span> <span class="special">=</span> <span class="identifier">compute_foo</span><span class="special">();</span>
2043 <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>
2044<span class="special">}</span>
2045
2046<span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&gt;</span> <span class="identifier">v</span> <span class="special">=</span> <span class="identifier">calculate_foo</span><span class="special">();</span>
2047<span class="keyword">if</span> <span class="special">(</span> <span class="special">!</span><span class="identifier">v</span> <span class="special">)</span>
2048 <span class="identifier">error</span><span class="special">(</span><span class="string">"foo wasn't computed"</span><span class="special">);</span>
2049</pre>
2050 </li>
2051</ul></div>
2052<p>
2053 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
2054 </p>
2055<a name="reference_operator_compare_equal_optional_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
2056 <code class="computeroutput"><span class="keyword">bool</span> <span class="keyword">operator</span>
2057 <span class="special">==</span> <span class="special">(</span>
2058 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">y</span> <span class="special">);</span></code>
2059 </p></blockquote></div>
2060<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
2061<li class="listitem">
2062 <span class="bold"><strong>Requires:</strong></span> <code class="computeroutput"><span class="identifier">T</span></code>
2063 shall meet requirements of <a href="http://www.sgi.com/tech/stl/EqualityComparable.html" target="_top"><code class="computeroutput"><span class="identifier">EqualityComparable</span></code></a>.
2064 </li>
2065<li class="listitem">
2066 <span class="bold"><strong>Returns:</strong></span> If both <code class="computeroutput"><span class="identifier">x</span></code>
2067 and <code class="computeroutput"><span class="identifier">y</span></code> are initialized,
2068 <code class="computeroutput"><span class="special">(*</span><span class="identifier">x</span>
2069 <span class="special">==</span> <span class="special">*</span><span class="identifier">y</span><span class="special">)</span></code>.
2070 If 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>.
2071 If both are uninitialized, <code class="computeroutput"><span class="keyword">true</span></code>.
2072 </li>
2073<li class="listitem">
2074 <span class="bold"><strong>Notes:</strong></span> This definition guarantees
2075 that <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code>
2076 not containing a value is compared unequal to any <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code> containing any value, and equal
2077 to any other <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code> not containing a value. Pointers
2078 have shallow relational operators while <code class="computeroutput"><span class="identifier">optional</span></code>
2079 has deep relational operators. Do not use <code class="computeroutput"><span class="keyword">operator</span><span class="special">==</span></code> directly in generic code which expect
2080 to be given either an <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</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>
2081 instead
2082 </li>
2083<li class="listitem">
2084 <span class="bold"><strong>Example:</strong></span>
2085<pre class="programlisting"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">oN</span><span class="special">,</span> <span class="identifier">oN_</span><span class="special">;</span>
2086<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">o1</span><span class="special">(</span><span class="identifier">T</span><span class="special">(</span><span class="number">1</span><span class="special">)),</span> <span class="identifier">o1_</span><span class="special">(</span><span class="identifier">T</span><span class="special">(</span><span class="number">1</span><span class="special">));</span>
2087<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">o2</span><span class="special">(</span><span class="identifier">T</span><span class="special">(</span><span class="number">2</span><span class="special">));</span>
2088
2089<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">oN</span> <span class="special">==</span> <span class="identifier">oN</span> <span class="special">);</span> <span class="comment">// Identity implies equality</span>
2090<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">o1</span> <span class="special">==</span> <span class="identifier">o1</span> <span class="special">);</span> <span class="comment">//</span>
2091
2092<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">oN</span> <span class="special">==</span> <span class="identifier">oN_</span> <span class="special">);</span> <span class="comment">// Both uninitialized compare equal</span>
2093
2094<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">oN</span> <span class="special">!=</span> <span class="identifier">o1</span> <span class="special">);</span> <span class="comment">// Initialized unequal to initialized.</span>
2095
2096<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">o1</span> <span class="special">==</span> <span class="identifier">o1_</span> <span class="special">);</span> <span class="comment">// Both initialized compare as (*lhs == *rhs)</span>
2097<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">o1</span> <span class="special">!=</span> <span class="identifier">o2</span> <span class="special">);</span> <span class="comment">//</span>
2098</pre>
2099 </li>
2100</ul></div>
2101<p>
2102 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
2103 </p>
2104<a name="reference_operator_compare_less_optional_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
2105 <code class="computeroutput"><span class="keyword">bool</span> <span class="keyword">operator</span>
2106 <span class="special">&lt;</span> <span class="special">(</span>
2107 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">y</span> <span class="special">);</span></code>
2108 </p></blockquote></div>
2109<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
2110<li class="listitem">
2111 <span class="bold"><strong>Requires:</strong></span> Expression <code class="computeroutput"><span class="special">*</span><span class="identifier">x</span> <span class="special">&lt;</span> <span class="special">*</span><span class="identifier">y</span></code> shall be well-formed and its result
2112 shall be convertible to <code class="computeroutput"><span class="keyword">bool</span></code>.
2113 </li>
2114<li class="listitem">
2115 <span class="bold"><strong>Returns:</strong></span> <code class="computeroutput"><span class="special">(!</span><span class="identifier">y</span><span class="special">)</span> <span class="special">?</span> <span class="keyword">false</span> <span class="special">:</span> <span class="special">(!</span><span class="identifier">x</span><span class="special">)</span> <span class="special">?</span> <span class="keyword">true</span> <span class="special">:</span> <span class="special">*</span><span class="identifier">x</span> <span class="special">&lt;</span>
2116 <span class="special">*</span><span class="identifier">y</span></code>.
2117 </li>
2118<li class="listitem">
2119 <span class="bold"><strong>Notes:</strong></span> This definition guarantees
2120 that <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code>
2121 not containing a value is ordered as less than any <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code> containing any value, and equivalent
2122 to any other <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code> not containing a value. Pointers
2123 have shallow relational operators while <code class="computeroutput"><span class="identifier">optional</span></code>
2124 has deep relational operators. Do not use <code class="computeroutput"><span class="keyword">operator</span><span class="special">&lt;</span></code> directly in generic code which
2125 expect to be given either an <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</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>
2126 instead. <code class="computeroutput"><span class="identifier">T</span></code> need not
2127 be <a href="http://www.sgi.com/tech/stl/LessThanComparable.html" target="_top"><code class="computeroutput"><span class="identifier">LessThanComparable</span></code></a>. Only
2128 single <code class="computeroutput"><span class="keyword">operator</span><span class="special">&lt;</span></code>
2129 is required. Other relational operations are defined in terms of this
2130 one. If <code class="computeroutput"><span class="identifier">T</span></code>'s <code class="computeroutput"><span class="keyword">operator</span><span class="special">&lt;</span></code>
2131 satisfies the axioms of <a href="http://www.sgi.com/tech/stl/LessThanComparable.html" target="_top"><code class="computeroutput"><span class="identifier">LessThanComparable</span></code></a> (transitivity,
2132 antisymmetry and irreflexivity), <code class="computeroutput"><span class="identifier">optinal</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code> is <a href="http://www.sgi.com/tech/stl/LessThanComparable.html" target="_top"><code class="computeroutput"><span class="identifier">LessThanComparable</span></code></a>.
2133 </li>
2134<li class="listitem">
2135 <span class="bold"><strong>Example:</strong></span>
2136<pre class="programlisting"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">oN</span><span class="special">,</span> <span class="identifier">oN_</span><span class="special">;</span>
2137<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">o0</span><span class="special">(</span><span class="identifier">T</span><span class="special">(</span><span class="number">0</span><span class="special">));</span>
2138<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">o1</span><span class="special">(</span><span class="identifier">T</span><span class="special">(</span><span class="number">1</span><span class="special">));</span>
2139
2140<span class="identifier">assert</span> <span class="special">(</span> <span class="special">!(</span><span class="identifier">oN</span> <span class="special">&lt;</span> <span class="identifier">oN</span><span class="special">)</span> <span class="special">);</span> <span class="comment">// Identity implies equivalence</span>
2141<span class="identifier">assert</span> <span class="special">(</span> <span class="special">!(</span><span class="identifier">o1</span> <span class="special">&lt;</span> <span class="identifier">o1</span><span class="special">)</span> <span class="special">);</span>
2142
2143<span class="identifier">assert</span> <span class="special">(</span> <span class="special">!(</span><span class="identifier">oN</span> <span class="special">&lt;</span> <span class="identifier">oN_</span><span class="special">)</span> <span class="special">);</span> <span class="comment">// Two uninitialized are equivalent</span>
2144<span class="identifier">assert</span> <span class="special">(</span> <span class="special">!(</span><span class="identifier">oN_</span> <span class="special">&lt;</span> <span class="identifier">oN</span><span class="special">)</span> <span class="special">);</span>
2145
2146<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">oN</span> <span class="special">&lt;</span> <span class="identifier">o0</span> <span class="special">);</span> <span class="comment">// Uninitialized is less than initialized</span>
2147<span class="identifier">assert</span> <span class="special">(</span> <span class="special">!(</span><span class="identifier">o0</span> <span class="special">&lt;</span> <span class="identifier">oN</span><span class="special">)</span> <span class="special">);</span>
2148
2149<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">o1</span> <span class="special">&lt;</span> <span class="identifier">o2</span> <span class="special">)</span> <span class="special">;</span> <span class="comment">// Two initialized compare as (*lhs &lt; *rhs)</span>
2150<span class="identifier">assert</span> <span class="special">(</span> <span class="special">!(</span><span class="identifier">o2</span> <span class="special">&lt;</span> <span class="identifier">o1</span><span class="special">)</span> <span class="special">)</span> <span class="special">;</span>
2151<span class="identifier">assert</span> <span class="special">(</span> <span class="special">!(</span><span class="identifier">o2</span> <span class="special">&lt;</span> <span class="identifier">o2</span><span class="special">)</span> <span class="special">)</span> <span class="special">;</span>
2152</pre>
2153 </li>
2154</ul></div>
2155<p>
2156 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
2157 </p>
2158<a name="reference_operator_compare_not_equal_optional_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
2159 <code class="computeroutput"><span class="keyword">bool</span> <span class="keyword">operator</span>
2160 <span class="special">!=</span> <span class="special">(</span>
2161 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">y</span> <span class="special">);</span></code>
2162 </p></blockquote></div>
2163<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
2164 <span class="bold"><strong>Returns: </strong></span> <code class="computeroutput"><span class="special">!(</span>
2165 <span class="identifier">x</span> <span class="special">==</span>
2166 <span class="identifier">y</span> <span class="special">);</span></code>
2167 </li></ul></div>
2168<p>
2169 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
2170 </p>
2171<a name="reference_operator_compare_greater_optional_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
2172 <code class="computeroutput"><span class="keyword">bool</span> <span class="keyword">operator</span>
2173 <span class="special">&gt;</span> <span class="special">(</span>
2174 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">y</span> <span class="special">);</span></code>
2175 </p></blockquote></div>
2176<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
2177 <span class="bold"><strong>Returns: </strong></span> <code class="computeroutput"><span class="special">(</span>
2178 <span class="identifier">y</span> <span class="special">&lt;</span>
2179 <span class="identifier">x</span> <span class="special">);</span></code>
2180 </li></ul></div>
2181<p>
2182 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
2183 </p>
2184<a name="reference_operator_compare_less_or_equal_optional_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
2185 <code class="computeroutput"><span class="keyword">bool</span> <span class="keyword">operator</span>
2186 <span class="special">&lt;=</span> <span class="special">(</span>
2187 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">y</span> <span class="special">);</span></code>
2188 </p></blockquote></div>
2189<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
2190 <span class="bold"><strong>Returns: </strong></span> <code class="computeroutput"><span class="special">!(</span>
2191 <span class="identifier">y</span> <span class="special">&lt;</span>
2192 <span class="identifier">x</span> <span class="special">);</span></code>
2193 </li></ul></div>
2194<p>
2195 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
2196 </p>
2197<a name="reference_operator_compare_greater_or_equal_optional_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
2198 <code class="computeroutput"><span class="keyword">bool</span> <span class="keyword">operator</span>
2199 <span class="special">&gt;=</span> <span class="special">(</span>
2200 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">y</span> <span class="special">);</span></code>
2201 </p></blockquote></div>
2202<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
2203 <span class="bold"><strong>Returns: </strong></span> <code class="computeroutput"><span class="special">!(</span>
2204 <span class="identifier">x</span> <span class="special">&lt;</span>
2205 <span class="identifier">y</span> <span class="special">);</span></code>
2206 </li></ul></div>
2207<p>
2208 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
2209 </p>
2210<a name="reference_operator_compare_equal_optional_none"></a><div class="blockquote"><blockquote class="blockquote"><p>
2211 <code class="computeroutput"><span class="keyword">bool</span> <span class="keyword">operator</span>
2212 <span class="special">==</span> <span class="special">(</span>
2213 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">none_t</span> <span class="special">)</span>
2214 <span class="keyword">noexcept</span><span class="special">;</span></code>
2215 </p></blockquote></div>
2216<div class="blockquote"><blockquote class="blockquote"><p>
2217 <code class="computeroutput"><span class="keyword">bool</span> <span class="keyword">operator</span>
2218 <span class="special">==</span> <span class="special">(</span>
2219 <span class="identifier">none_t</span><span class="special">,</span>
2220 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span> <span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span></code>
2221 </p></blockquote></div>
2222<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
2223<li class="listitem">
2224 <span class="bold"><strong>Returns:</strong></span> <code class="computeroutput"><span class="special">!</span><span class="identifier">x</span></code>.
2225 </li>
2226<li class="listitem">
2227 <span class="bold"><strong>Notes:</strong></span> <code class="computeroutput"><span class="identifier">T</span></code>
2228 need not meet requirements of <a href="http://www.sgi.com/tech/stl/EqualityComparable.html" target="_top"><code class="computeroutput"><span class="identifier">EqualityComparable</span></code></a>.
2229 </li>
2230</ul></div>
2231<p>
2232 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
2233 </p>
2234<a name="reference_operator_compare_not_equal_optional_none"></a><div class="blockquote"><blockquote class="blockquote"><p>
2235 <code class="computeroutput"><span class="keyword">bool</span> <span class="keyword">operator</span>
2236 <span class="special">!=</span> <span class="special">(</span>
2237 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">none_t</span> <span class="special">)</span>
2238 <span class="keyword">noexcept</span><span class="special">;</span></code>
2239 </p></blockquote></div>
2240<div class="blockquote"><blockquote class="blockquote"><p>
2241 <code class="computeroutput"><span class="keyword">bool</span> <span class="keyword">operator</span>
2242 <span class="special">!=</span> <span class="special">(</span>
2243 <span class="identifier">none_t</span><span class="special">,</span>
2244 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span> <span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span></code>
2245 </p></blockquote></div>
2246<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
2247 <span class="bold"><strong>Returns: </strong></span> <code class="computeroutput"><span class="special">!(</span>
2248 <span class="identifier">x</span> <span class="special">==</span>
2249 <span class="identifier">y</span> <span class="special">);</span></code>
2250 </li></ul></div>
2251<p>
2252 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
2253 </p>
2254<a name="reference_swap_optional_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
2255 <code class="computeroutput"><span class="keyword">void</span> <span class="identifier">swap</span>
2256 <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&amp;</span> <span class="identifier">y</span>
2257 <span class="special">)</span> <span class="special">;</span></code>
2258 </p></blockquote></div>
2259<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
2260<li class="listitem">
2261 <span class="bold"><strong>Requires:</strong></span> Lvalues of type <code class="computeroutput"><span class="identifier">T</span></code> shall be swappable and <code class="computeroutput"><span class="identifier">T</span></code> shall be <code class="computeroutput"><span class="identifier">MoveConstructible</span></code>.
2262 </li>
2263<li class="listitem">
2264<p class="simpara">
2265 <span class="bold"><strong>Effects:</strong></span>
2266 </p>
2267<div class="informaltable"><table class="table">
2268<colgroup>
2269<col>
2270<col>
2271<col>
2272</colgroup>
2273<thead><tr></tr></thead>
2274<tbody>
2275<tr>
2276<td>
2277 </td>
2278<td>
2279 <p>
2280 <span class="bold"><strong><code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> contains a value</strong></span>
2281 </p>
2282 </td>
2283<td>
2284 <p>
2285 <span class="bold"><strong><code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> does not contain a value</strong></span>
2286 </p>
2287 </td>
2288</tr>
2289<tr>
2290<td>
2291 <p>
2292 <span class="bold"><strong><code class="computeroutput"><span class="identifier">rhs</span></code>
2293 contains a value</strong></span>
2294 </p>
2295 </td>
2296<td>
2297 <p>
2298 calls <code class="computeroutput"><span class="identifier">swap</span><span class="special">(*(*</span><span class="keyword">this</span><span class="special">),</span> <span class="special">*</span><span class="identifier">rhs</span><span class="special">)</span></code>
2299 </p>
2300 </td>
2301<td>
2302 <p>
2303 initializes the contained value of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> as if direct-initializing
2304 an object of type <code class="computeroutput"><span class="identifier">T</span></code>
2305 with the expression <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(*</span><span class="identifier">rhs</span><span class="special">)</span></code>, followed by <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">val</span><span class="special">-&gt;</span><span class="identifier">T</span><span class="special">::~</span><span class="identifier">T</span><span class="special">()</span></code>,
2306 <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
2307 contains a value and <code class="computeroutput"><span class="identifier">rhs</span></code>
2308 does not contain a value
2309 </p>
2310 </td>
2311</tr>
2312<tr>
2313<td>
2314 <p>
2315 <span class="bold"><strong><code class="computeroutput"><span class="identifier">rhs</span></code>
2316 does not contain a value</strong></span>
2317 </p>
2318 </td>
2319<td>
2320 <p>
2321 initializes the contained value of <code class="computeroutput"><span class="identifier">rhs</span></code>
2322 as if direct-initializing an object of type <code class="computeroutput"><span class="identifier">T</span></code> with the expression
2323 <code class="computeroutput"><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></code>,
2324 followed by <code class="computeroutput"><span class="identifier">val</span><span class="special">-&gt;</span><span class="identifier">T</span><span class="special">::~</span><span class="identifier">T</span><span class="special">()</span></code>, <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> does not contain a value
2325 and <code class="computeroutput"><span class="identifier">rhs</span></code> contains
2326 a value
2327 </p>
2328 </td>
2329<td>
2330 <p>
2331 no effect
2332 </p>
2333 </td>
2334</tr>
2335</tbody>
2336</table></div>
2337</li>
2338<li class="listitem">
2339 <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>
2340 interchanged.
2341 </li>
2342<li class="listitem">
2343 <span class="bold"><strong>Throws:</strong></span> If both are initialized, whatever
2344 <code class="computeroutput"><span class="identifier">swap</span><span class="special">(</span><span class="identifier">T</span><span class="special">&amp;,</span><span class="identifier">T</span><span class="special">&amp;)</span></code>
2345 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">&amp;&amp;</span> <span class="special">)</span></code>
2346 throws.
2347 </li>
2348<li class="listitem">
2349 <span class="bold"><strong>Example:</strong></span>
2350<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>
2351<span class="identifier">T</span> <span class="identifier">y</span><span class="special">(</span><span class="number">21</span><span class="special">);</span>
2352<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">def0</span> <span class="special">;</span>
2353<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">def1</span> <span class="special">;</span>
2354<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">optX</span><span class="special">(</span><span class="identifier">x</span><span class="special">);</span>
2355<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">optY</span><span class="special">(</span><span class="identifier">y</span><span class="special">);</span>
2356
2357<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>
2358
2359<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>
2360<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>
2361<span class="identifier">assert</span> <span class="special">(</span> <span class="special">!</span><span class="identifier">optX</span> <span class="special">);</span>
2362
2363<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>
2364
2365<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>
2366<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>
2367<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>
2368</pre>
2369 </li>
2370</ul></div>
2371<p>
2372 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
2373 </p>
2374<a name="reference_swap_optional_reference"></a><div class="blockquote"><blockquote class="blockquote"><p>
2375 <code class="computeroutput"><span class="keyword">void</span> <span class="identifier">swap</span>
2376 <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;&amp;</span> <span class="identifier">y</span>
2377 <span class="special">)</span> <span class="keyword">noexcept</span>
2378 <span class="special">;</span></code>
2379 </p></blockquote></div>
2380<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
2381<li class="listitem">
2382 <span class="bold"><strong>Postconditions:</strong></span> <code class="computeroutput"><span class="identifier">x</span></code>
2383 refers to what <code class="computeroutput"><span class="identifier">y</span></code> refererred
2384 to before the swap (if anything). <code class="computeroutput"><span class="identifier">y</span></code>
2385 refers to whatever <code class="computeroutput"><span class="identifier">x</span></code>
2386 referred to before the swap.
2387 </li>
2388<li class="listitem">
2389 <span class="bold"><strong>Example:</strong></span>
2390<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>
2391<span class="identifier">T</span> <span class="identifier">y</span><span class="special">(</span><span class="number">21</span><span class="special">);</span>
2392
2393<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span> <span class="identifier">opt0</span><span class="special">;</span>
2394<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span> <span class="identifier">optX</span> <span class="special">(</span><span class="identifier">x</span><span class="special">);</span>
2395<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span> <span class="identifier">optY</span> <span class="special">(</span><span class="identifier">y</span><span class="special">);</span>
2396
2397<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>
2398<span class="identifier">assert</span> <span class="special">(</span><span class="identifier">addressof</span><span class="special">(*</span><span class="identifier">optX</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">addressof</span><span class="special">(</span><span class="identifier">y</span><span class="special">));</span>
2399<span class="identifier">assert</span> <span class="special">(</span><span class="identifier">addressof</span><span class="special">(*</span><span class="identifier">optY</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">addressof</span><span class="special">(</span><span class="identifier">x</span><span class="special">));</span>
2400
2401<span class="identifier">boost</span><span class="special">::</span><span class="identifier">swap</span><span class="special">(</span><span class="identifier">opt0</span><span class="special">,</span> <span class="identifier">optX</span><span class="special">);</span>
2402<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">opt0</span> <span class="special">);</span>
2403<span class="identifier">assert</span> <span class="special">(</span> <span class="special">!</span><span class="identifier">optX</span> <span class="special">);</span>
2404<span class="identifier">assert</span> <span class="special">(</span><span class="identifier">addressof</span><span class="special">(*</span><span class="identifier">opt0</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">addressof</span><span class="special">(</span><span class="identifier">y</span><span class="special">));</span>
2405</pre>
2406 [endsect]
2407 </li>
2408</ul></div>
2409</div>
2410<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
2411<td align="left"></td>
2412<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014-2016 Andrzej Krzemie&#324;ski<p>
2413 Distributed under the Boost Software License, Version 1.0. (See accompanying
2414 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>)
2415 </p>
2416</div></td>
2417</tr></table>
2418<hr>
2419<div class="spirit-nav">
2420<a accesskey="p" href="header_optional_optional_refs.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../../optional/reference/header__boost_optional_optional_hpp_.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="header__boost_optional_hpp_.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
2421</div>
2422</body>
2423</html>