blob: b93515fcc6a266ab623ad3082e25b085339ee742 [file] [log] [blame]
Brian Silvermanaf2eaa82018-08-04 17:28:31 -07001<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="Chapter&#160;1.&#160;Boost.Optional">
8<link rel="up" href="../index.html" title="Chapter&#160;1.&#160;Boost.Optional">
9<link rel="prev" href="synopsis.html" title="Synopsis">
10<link rel="next" href="dependencies_and_portability.html" title="Dependencies and Portability">
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="synopsis.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="dependencies_and_portability.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
24</div>
25<div class="section">
26<div class="titlepage"><div><div><h2 class="title" style="clear: both">
27<a name="boost_optional.detailed_semantics"></a><a class="link" href="detailed_semantics.html" title="Detailed Semantics">Detailed Semantics</a>
28</h2></div></div></div>
29<p>
30 Because <code class="computeroutput"><span class="identifier">T</span></code> might be of reference
31 type, in the sequel, those entries whose semantic depends on <code class="computeroutput"><span class="identifier">T</span></code> being of reference type or not will be
32 distinguished using the following convention:
33 </p>
34<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
35<li class="listitem">
36 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
37 a ref)</em></span><code class="computeroutput"><span class="special">&gt;</span></code>, the
38 description corresponds only to the case where <code class="computeroutput"><span class="identifier">T</span></code>
39 is not of reference type.
40 </li>
41<li class="listitem">
42 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 only
43 to the case where <code class="computeroutput"><span class="identifier">T</span></code> is
44 of reference type.
45 </li>
46<li class="listitem">
47 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 both
48 cases.
49 </li>
50</ul></div>
51<div class="note"><table border="0" summary="Note">
52<tr>
53<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td>
54<th align="left">Note</th>
55</tr>
56<tr><td align="left" valign="top"><p>
57 The following section contains various <code class="computeroutput"><span class="identifier">assert</span><span class="special">()</span></code> which are used only to show the postconditions
58 as sample code. It is not implied that the type <code class="computeroutput"><span class="identifier">T</span></code>
59 must support each particular expression but that if the expression is supported,
60 the implied condition holds.
61 </p></td></tr>
62</table></div>
63<p>
64 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
65 </p>
66<h4>
67<a name="boost_optional.detailed_semantics.h0"></a>
68 <span class="phrase"><a name="boost_optional.detailed_semantics.optional_class_member_functions"></a></span><a class="link" href="detailed_semantics.html#boost_optional.detailed_semantics.optional_class_member_functions">optional
69 class member functions</a>
70 </h4>
71<p>
72 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
73 </p>
74<a name="reference_optional_constructor"></a><div class="blockquote"><blockquote class="blockquote"><p>
75 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">optional</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span></code>
76 </p></blockquote></div>
77<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
78<li class="listitem">
79 <span class="bold"><strong>Effect:</strong></span> Default-Constructs an <code class="computeroutput"><span class="identifier">optional</span></code>.
80 </li>
81<li class="listitem">
82 <span class="bold"><strong>Postconditions:</strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is <span class="underline">uninitialized</span>.
83 </li>
84<li class="listitem">
85 <span class="bold"><strong>Notes:</strong></span> T's default constructor <span class="underline">is not</span> called.
86 </li>
87<li class="listitem">
88 <span class="bold"><strong>Example:</strong></span>
89<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>
90<span class="identifier">assert</span> <span class="special">(</span> <span class="special">!</span><span class="identifier">def</span> <span class="special">)</span> <span class="special">;</span>
91</pre>
92 </li>
93</ul></div>
94<p>
95 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
96 </p>
97<a name="reference_optional_constructor_none_t"></a><div class="blockquote"><blockquote class="blockquote"><p>
98 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">optional</span><span class="special">(</span> <span class="identifier">none_t</span> <span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span></code>
99 </p></blockquote></div>
100<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
101<li class="listitem">
102 <span class="bold"><strong>Effect:</strong></span> Constructs an <code class="computeroutput"><span class="identifier">optional</span></code>
103 uninitialized.
104 </li>
105<li class="listitem">
106 <span class="bold"><strong>Postconditions:</strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is <span class="underline">uninitialized</span>.
107 </li>
108<li class="listitem">
109 <span class="bold"><strong>Notes:</strong></span> <code class="computeroutput"><span class="identifier">T</span></code>'s
110 default constructor <span class="underline">is not</span> called.
111 The expression <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">none</span></code> denotes an instance of <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">none_t</span></code> that can be used as the parameter.
112 </li>
113<li class="listitem">
114 <span class="bold"><strong>Example:</strong></span>
115<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>
116<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>
117<span class="identifier">assert</span> <span class="special">(</span> <span class="special">!</span><span class="identifier">n</span> <span class="special">)</span> <span class="special">;</span>
118</pre>
119 </li>
120</ul></div>
121<p>
122 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
123 </p>
124<a name="reference_optional_constructor_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
125 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&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>
126 </p></blockquote></div>
127<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
128<li class="listitem">
129 <span class="bold"><strong>Requires:</strong></span> <code class="computeroutput"><span class="identifier">is_copy_constructible</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span></code>
130 is <code class="computeroutput"><span class="keyword">true</span></code>.
131 </li>
132<li class="listitem">
133 <span class="bold"><strong>Effect:</strong></span> Directly-Constructs an <code class="computeroutput"><span class="identifier">optional</span></code>.
134 </li>
135<li class="listitem">
136 <span class="bold"><strong>Postconditions:</strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is <span class="underline">initialized</span>
137 and its value is a <span class="emphasis"><em>copy</em></span> of <code class="computeroutput"><span class="identifier">v</span></code>.
138 </li>
139<li class="listitem">
140 <span class="bold"><strong>Throws:</strong></span> Whatever <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span>
141 <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">)</span></code>
142 throws.
143 </li>
144<li class="listitem">
145 <span class="bold"><strong>Notes: </strong></span> <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span>
146 <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">)</span></code>
147 is called.
148 </li>
149<li class="listitem">
150 <span class="bold"><strong>Exception Safety:</strong></span> Exceptions can only
151 be thrown during <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span> <span class="identifier">T</span>
152 <span class="keyword">const</span><span class="special">&amp;</span>
153 <span class="special">);</span></code> in that case, this constructor
154 has no effect.
155 </li>
156<li class="listitem">
157 <span class="bold"><strong>Example:</strong></span>
158<pre class="programlisting"><span class="identifier">T</span> <span class="identifier">v</span><span class="special">;</span>
159<span class="identifier">optional</span><span class="special">&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>
160<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">opt</span> <span class="special">==</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span>
161</pre>
162 </li>
163</ul></div>
164<p>
165 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
166 </p>
167<div class="blockquote"><blockquote class="blockquote"><p>
168 <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> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">ref</span> <span class="special">)</span></code>
169 </p></blockquote></div>
170<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
171<li class="listitem">
172 <span class="bold"><strong>Effect:</strong></span> Directly-Constructs an <code class="computeroutput"><span class="identifier">optional</span></code>.
173 </li>
174<li class="listitem">
175 <span class="bold"><strong>Postconditions:</strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is <span class="underline">initialized</span>
176 and its value is an instance of an internal type wrapping the reference
177 <code class="computeroutput"><span class="identifier">ref</span></code>.
178 </li>
179<li class="listitem">
180 <span class="bold"><strong>Throws:</strong></span> Nothing.
181 </li>
182<li class="listitem">
183 <span class="bold"><strong>Example:</strong></span>
184<pre class="programlisting"><span class="identifier">T</span> <span class="identifier">v</span><span class="special">;</span>
185<span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">vref</span> <span class="special">=</span> <span class="identifier">v</span> <span class="special">;</span>
186<span class="identifier">optional</span><span class="special">&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>
187<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">opt</span> <span class="special">==</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span>
188<span class="special">++</span> <span class="identifier">v</span> <span class="special">;</span> <span class="comment">// mutate referee</span>
189<span class="identifier">assert</span> <span class="special">(*</span><span class="identifier">opt</span> <span class="special">==</span> <span class="identifier">v</span><span class="special">);</span>
190</pre>
191 </li>
192</ul></div>
193<p>
194 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
195 </p>
196<a name="reference_optional_constructor_move_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
197 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&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>
198 <span class="identifier">v</span> <span class="special">)</span></code>
199 </p></blockquote></div>
200<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
201<li class="listitem">
202 <span class="bold"><strong>Requires:</strong></span> <code class="computeroutput"><span class="identifier">is_move_constructible</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span></code>
203 is <code class="computeroutput"><span class="keyword">true</span></code>.
204 </li>
205<li class="listitem">
206 <span class="bold"><strong>Effect:</strong></span> Directly-Move-Constructs an <code class="computeroutput"><span class="identifier">optional</span></code>.
207 </li>
208<li class="listitem">
209 <span class="bold"><strong>Postconditions:</strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is <span class="underline">initialized</span>
210 and its value is move-constructed from <code class="computeroutput"><span class="identifier">v</span></code>.
211 </li>
212<li class="listitem">
213 <span class="bold"><strong>Throws:</strong></span> Whatever <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span>
214 <span class="identifier">T</span><span class="special">&amp;&amp;</span>
215 <span class="special">)</span></code> throws.
216 </li>
217<li class="listitem">
218 <span class="bold"><strong>Notes: </strong></span> <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span>
219 <span class="identifier">T</span><span class="special">&amp;&amp;</span>
220 <span class="special">)</span></code> is called.
221 </li>
222<li class="listitem">
223 <span class="bold"><strong>Exception Safety:</strong></span> Exceptions can only
224 be thrown during <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span> <span class="identifier">T</span><span class="special">&amp;&amp;</span> <span class="special">);</span></code>
225 in that case, the state of <code class="computeroutput"><span class="identifier">v</span></code>
226 is determined by exception safety guarantees for <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span><span class="identifier">T</span><span class="special">&amp;&amp;)</span></code>.
227 </li>
228<li class="listitem">
229 <span class="bold"><strong>Example:</strong></span>
230<pre class="programlisting"><span class="identifier">T</span> <span class="identifier">v1</span><span class="special">,</span> <span class="identifier">v2</span><span class="special">;</span>
231<span class="identifier">optional</span><span class="special">&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>
232<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">opt</span> <span class="special">==</span> <span class="identifier">v2</span> <span class="special">)</span> <span class="special">;</span>
233</pre>
234 </li>
235</ul></div>
236<p>
237 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
238 </p>
239<div class="blockquote"><blockquote class="blockquote"><p>
240 <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> <span class="identifier">T</span><span class="special">&amp;&amp;</span> <span class="identifier">ref</span> <span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span></code>
241 </p></blockquote></div>
242<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
243 <span class="bold"><strong>Notes:</strong></span> This constructor is deleted
244 </li></ul></div>
245<p>
246 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
247 </p>
248<a name="reference_optional_constructor_bool_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
249 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&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> <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>
250 </p></blockquote></div>
251<div class="blockquote"><blockquote class="blockquote"><p>
252 <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="special">::</span><span class="identifier">optional</span><span class="special">(</span> <span class="keyword">bool</span> <span class="identifier">condition</span><span class="special">,</span> <span class="identifier">T</span><span class="special">&amp;</span>
253 <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span></code>
254 </p></blockquote></div>
255<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
256 If condition is true, same as:
257 </li></ul></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></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>
260 </p></blockquote></div>
261<div class="blockquote"><blockquote class="blockquote"><p>
262 <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="special">::</span><span class="identifier">optional</span><span class="special">(</span> <span class="identifier">T</span><span class="special">&amp;</span>
263 <span class="identifier">v</span> <span class="special">)</span></code>
264 </p></blockquote></div>
265<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
266 otherwise, 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></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> <span class="special">::</span><span class="identifier">optional</span><span class="special">()</span></code>
273 </p></blockquote></div>
274<p>
275 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
276 </p>
277<a name="reference_optional_constructor_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
278 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&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="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rhs</span> <span class="special">);</span></code>
279 </p></blockquote></div>
280<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
281<li class="listitem">
282 <span class="bold"><strong>Requires:</strong></span> <code class="computeroutput"><span class="identifier">is_copy_constructible</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span></code>
283 is <code class="computeroutput"><span class="keyword">true</span></code>.
284 </li>
285<li class="listitem">
286 <span class="bold"><strong>Effect:</strong></span> Copy-Constructs an <code class="computeroutput"><span class="identifier">optional</span></code>.
287 </li>
288<li class="listitem">
289 <span class="bold"><strong>Postconditions:</strong></span> If rhs is initialized,
290 <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
291 is initialized and its value is a <span class="emphasis"><em>copy</em></span> of the value
292 of <code class="computeroutput"><span class="identifier">rhs</span></code>; else <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is
293 uninitialized.
294 </li>
295<li class="listitem">
296 <span class="bold"><strong>Throws:</strong></span> Whatever <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span>
297 <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">)</span></code>
298 throws.
299 </li>
300<li class="listitem">
301 <span class="bold"><strong>Notes:</strong></span> If rhs is initialized, <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">)</span></code>
302 is called.
303 </li>
304<li class="listitem">
305 <span class="bold"><strong>Exception Safety:</strong></span> Exceptions can only
306 be thrown during <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span> <span class="identifier">T</span>
307 <span class="keyword">const</span><span class="special">&amp;</span>
308 <span class="special">);</span></code> in that case, this constructor
309 has no effect.
310 </li>
311<li class="listitem">
312 <span class="bold"><strong>Example:</strong></span>
313<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>
314<span class="identifier">assert</span> <span class="special">(!</span><span class="identifier">uninit</span><span class="special">);</span>
315
316<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>
317<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">uninit2</span> <span class="special">==</span> <span class="identifier">uninit</span> <span class="special">);</span>
318
319<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>
320<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">init</span> <span class="special">==</span> <span class="identifier">T</span><span class="special">(</span><span class="number">2</span><span class="special">)</span> <span class="special">)</span> <span class="special">;</span>
321
322<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>
323<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">init2</span> <span class="special">==</span> <span class="identifier">init</span> <span class="special">)</span> <span class="special">;</span>
324</pre>
325 </li>
326</ul></div>
327<p>
328 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
329 </p>
330<div class="blockquote"><blockquote class="blockquote"><p>
331 <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> <span class="identifier">optional</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rhs</span> <span class="special">);</span></code>
332 </p></blockquote></div>
333<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
334<li class="listitem">
335 <span class="bold"><strong>Effect:</strong></span> Copy-Constructs an <code class="computeroutput"><span class="identifier">optional</span></code>.
336 </li>
337<li class="listitem">
338 <span class="bold"><strong>Postconditions:</strong></span> If <code class="computeroutput"><span class="identifier">rhs</span></code>
339 is initialized, <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
340 is initialized and its value is another reference to the same object referenced
341 by <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code>;
342 else <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
343 is uninitialized.
344 </li>
345<li class="listitem">
346 <span class="bold"><strong>Throws:</strong></span> Nothing.
347 </li>
348<li class="listitem">
349 <span class="bold"><strong>Notes:</strong></span> If <code class="computeroutput"><span class="identifier">rhs</span></code>
350 is initialized, both <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
351 and <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code>
352 will reefer to the same object (they alias).
353 </li>
354<li class="listitem">
355 <span class="bold"><strong>Example:</strong></span>
356<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>
357<span class="identifier">assert</span> <span class="special">(!</span><span class="identifier">uninit</span><span class="special">);</span>
358
359<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>
360<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">uninit2</span> <span class="special">==</span> <span class="identifier">uninit</span> <span class="special">);</span>
361
362<span class="identifier">T</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">2</span> <span class="special">;</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">ref</span> <span class="special">=</span> <span class="identifier">v</span> <span class="special">;</span>
363<span class="identifier">optional</span><span class="special">&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>
364<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">init</span> <span class="special">==</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span>
365
366<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>
367<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">init2</span> <span class="special">==</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span>
368
369<span class="identifier">v</span> <span class="special">=</span> <span class="number">3</span> <span class="special">;</span>
370
371<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">init</span> <span class="special">==</span> <span class="number">3</span> <span class="special">)</span> <span class="special">;</span>
372<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">init2</span> <span class="special">==</span> <span class="number">3</span> <span class="special">)</span> <span class="special">;</span>
373</pre>
374 </li>
375</ul></div>
376<p>
377 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
378 </p>
379<a name="reference_optional_move_constructor_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
380 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&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>
381 <span class="special">)</span> <span class="keyword">noexcept</span><span class="special">(</span></code><span class="emphasis"><em>see below</em></span><code class="computeroutput"><span class="special">);</span></code>
382 </p></blockquote></div>
383<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
384<li class="listitem">
385 <span class="bold"><strong>Requires:</strong></span> <code class="computeroutput"><span class="identifier">is_move_constructible</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span></code>
386 is <code class="computeroutput"><span class="keyword">true</span></code>.
387 </li>
388<li class="listitem">
389 <span class="bold"><strong>Effect:</strong></span> Move-constructs an <code class="computeroutput"><span class="identifier">optional</span></code>.
390 </li>
391<li class="listitem">
392 <span class="bold"><strong>Postconditions:</strong></span> If <code class="computeroutput"><span class="identifier">rhs</span></code>
393 is initialized, <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
394 is initialized and its value is move constructed from <code class="computeroutput"><span class="identifier">rhs</span></code>;
395 else <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
396 is uninitialized.
397 </li>
398<li class="listitem">
399 <span class="bold"><strong>Throws:</strong></span> Whatever <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span>
400 <span class="identifier">T</span><span class="special">&amp;&amp;</span>
401 <span class="special">)</span></code> throws.
402 </li>
403<li class="listitem">
404 <span class="bold"><strong>Notes:</strong></span> If <code class="computeroutput"><span class="identifier">rhs</span></code>
405 is initialized, <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span> <span class="identifier">T</span>
406 <span class="special">&amp;&amp;</span> <span class="special">)</span></code>
407 is called. The expression inside <code class="computeroutput"><span class="keyword">noexcept</span></code>
408 is equivalent to <code class="computeroutput"><span class="identifier">is_nothrow_move_constructible</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span></code>.
409 </li>
410<li class="listitem">
411 <span class="bold"><strong>Exception Safety:</strong></span> Exceptions can only
412 be thrown during <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span> <span class="identifier">T</span><span class="special">&amp;&amp;</span> <span class="special">);</span></code>
413 in that case, <code class="computeroutput"><span class="identifier">rhs</span></code> remains
414 initialized and the value of <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code> is determined by exception safety
415 of <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span><span class="identifier">T</span><span class="special">&amp;&amp;)</span></code>.
416 </li>
417<li class="listitem">
418 <span class="bold"><strong>Example:</strong></span>
419<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>
420<span class="identifier">assert</span> <span class="special">(!</span><span class="identifier">uninit</span><span class="special">);</span>
421
422<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>
423<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">uninit2</span> <span class="special">==</span> <span class="identifier">uninit</span> <span class="special">);</span>
424
425<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>
426<span class="identifier">assert</span> <span class="special">(</span> <span class="special">**</span><span class="identifier">init</span> <span class="special">==</span> <span class="identifier">T</span><span class="special">(</span><span class="number">2</span><span class="special">)</span> <span class="special">)</span> <span class="special">;</span>
427
428<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>
429<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">init</span> <span class="special">);</span>
430<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">init</span> <span class="special">==</span> <span class="keyword">nullptr</span> <span class="special">);</span>
431<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">init2</span> <span class="special">);</span>
432<span class="identifier">assert</span> <span class="special">(</span> <span class="special">**</span><span class="identifier">init2</span> <span class="special">==</span> <span class="identifier">T</span><span class="special">(</span><span class="number">2</span><span class="special">)</span> <span class="special">)</span> <span class="special">;</span>
433</pre>
434 </li>
435</ul></div>
436<p>
437 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
438 </p>
439<div class="blockquote"><blockquote class="blockquote"><p>
440 <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> <span class="identifier">optional</span> <span class="special">&amp;&amp;</span>
441 <span class="identifier">rhs</span> <span class="special">);</span></code>
442 </p></blockquote></div>
443<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
444<li class="listitem">
445 <span class="bold"><strong>Effect:</strong></span> Move-Constructs an <code class="computeroutput"><span class="identifier">optional</span></code>.
446 </li>
447<li class="listitem">
448 <span class="bold"><strong>Postconditions:</strong></span> If <code class="computeroutput"><span class="identifier">rhs</span></code>
449 is initialized, <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
450 is initialized and its value is another reference to the same object referenced
451 by <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code>;
452 else <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
453 is uninitialized.
454 </li>
455<li class="listitem">
456 <span class="bold"><strong>Throws:</strong></span> Nothing.
457 </li>
458<li class="listitem">
459 <span class="bold"><strong>Notes:</strong></span> If <code class="computeroutput"><span class="identifier">rhs</span></code>
460 is initialized, both <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
461 and <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code>
462 will reefer to the same object (they alias).
463 </li>
464<li class="listitem">
465 <span class="bold"><strong>Example:</strong></span>
466<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>
467<span class="identifier">assert</span> <span class="special">(!</span><span class="identifier">uninit</span><span class="special">);</span>
468
469<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>
470<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">uninit2</span> <span class="special">==</span> <span class="identifier">uninit</span> <span class="special">);</span>
471
472<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>
473<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>
474<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">init</span> <span class="special">==</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span>
475
476<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>
477<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">init2</span> <span class="special">==</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span>
478
479<span class="special">*</span><span class="identifier">v</span> <span class="special">=</span> <span class="number">3</span> <span class="special">;</span>
480
481<span class="identifier">assert</span> <span class="special">(</span> <span class="special">**</span><span class="identifier">init</span> <span class="special">==</span> <span class="number">3</span> <span class="special">)</span> <span class="special">;</span>
482<span class="identifier">assert</span> <span class="special">(</span> <span class="special">**</span><span class="identifier">init2</span> <span class="special">==</span> <span class="number">3</span> <span class="special">)</span> <span class="special">;</span>
483</pre>
484 </li>
485</ul></div>
486<p>
487 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
488 </p>
489<a name="reference_optional_constructor_other_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
490 <code class="computeroutput"><span class="keyword">template</span><span class="special">&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>
491 <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">&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>
492 </p></blockquote></div>
493<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
494<li class="listitem">
495 <span class="bold"><strong>Effect:</strong></span> Copy-Constructs an <code class="computeroutput"><span class="identifier">optional</span></code>.
496 </li>
497<li class="listitem">
498 <span class="bold"><strong>Postconditions:</strong></span> If <code class="computeroutput"><span class="identifier">rhs</span></code>
499 is initialized, <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
500 is initialized and its value is a <span class="emphasis"><em>copy</em></span> of the value
501 of rhs converted to type <code class="computeroutput"><span class="identifier">T</span></code>;
502 else <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
503 is uninitialized.
504 </li>
505<li class="listitem">
506 <span class="bold"><strong>Throws:</strong></span> Whatever <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span>
507 <span class="identifier">U</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">)</span></code>
508 throws.
509 </li>
510<li class="listitem">
511 <span class="bold"><strong>Notes: </strong></span> <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span>
512 <span class="identifier">U</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">)</span></code>
513 is called if <code class="computeroutput"><span class="identifier">rhs</span></code> is initialized,
514 which requires a valid conversion from <code class="computeroutput"><span class="identifier">U</span></code>
515 to <code class="computeroutput"><span class="identifier">T</span></code>.
516 </li>
517<li class="listitem">
518 <span class="bold"><strong>Exception Safety:</strong></span> Exceptions can only
519 be thrown during <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span> <span class="identifier">U</span>
520 <span class="keyword">const</span><span class="special">&amp;</span>
521 <span class="special">);</span></code> in that case, this constructor
522 has no effect.
523 </li>
524<li class="listitem">
525 <span class="bold"><strong>Example:</strong></span>
526<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>
527<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">x</span> <span class="special">==</span> <span class="number">123.4</span> <span class="special">)</span> <span class="special">;</span>
528
529<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>
530<span class="identifier">assert</span><span class="special">(</span> <span class="special">*</span><span class="identifier">y</span> <span class="special">==</span> <span class="number">123</span> <span class="special">)</span> <span class="special">;</span>
531</pre>
532 </li>
533</ul></div>
534<p>
535 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
536 </p>
537<a name="reference_optional_move_constructor_other_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
538 <code class="computeroutput"><span class="keyword">template</span><span class="special">&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>
539 <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">&lt;</span><span class="identifier">U</span><span class="special">&gt;&amp;&amp;</span>
540 <span class="identifier">rhs</span> <span class="special">);</span></code>
541 </p></blockquote></div>
542<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
543<li class="listitem">
544 <span class="bold"><strong>Effect:</strong></span> Move-constructs an <code class="computeroutput"><span class="identifier">optional</span></code>.
545 </li>
546<li class="listitem">
547 <span class="bold"><strong>Postconditions:</strong></span> If <code class="computeroutput"><span class="identifier">rhs</span></code>
548 is initialized, <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
549 is initialized and its value is move constructed from <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code>; else <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is uninitialized.
550 </li>
551<li class="listitem">
552 <span class="bold"><strong>Throws:</strong></span> Whatever <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span>
553 <span class="identifier">U</span><span class="special">&amp;&amp;</span>
554 <span class="special">)</span></code> throws.
555 </li>
556<li class="listitem">
557 <span class="bold"><strong>Notes: </strong></span> <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span>
558 <span class="identifier">U</span><span class="special">&amp;&amp;</span>
559 <span class="special">)</span></code> is called if <code class="computeroutput"><span class="identifier">rhs</span></code>
560 is initialized, which requires a valid conversion from <code class="computeroutput"><span class="identifier">U</span></code>
561 to <code class="computeroutput"><span class="identifier">T</span></code>.
562 </li>
563<li class="listitem">
564 <span class="bold"><strong>Exception Safety:</strong></span> Exceptions can only
565 be thrown during <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span> <span class="identifier">U</span><span class="special">&amp;&amp;</span> <span class="special">);</span></code>
566 in that case, <code class="computeroutput"><span class="identifier">rhs</span></code> remains
567 initialized and the value of <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code> is determined by exception safety
568 guarantee of <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span> <span class="identifier">U</span><span class="special">&amp;&amp;</span> <span class="special">)</span></code>.
569 </li>
570<li class="listitem">
571 <span class="bold"><strong>Example:</strong></span>
572<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>
573<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">x</span> <span class="special">==</span> <span class="number">123.4</span> <span class="special">)</span> <span class="special">;</span>
574
575<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>
576<span class="identifier">assert</span><span class="special">(</span> <span class="special">*</span><span class="identifier">y</span> <span class="special">==</span> <span class="number">123</span> <span class="special">)</span> <span class="special">;</span>
577</pre>
578 </li>
579</ul></div>
580<p>
581 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
582 </p>
583<a name="reference_optional_constructor_factory"></a><div class="blockquote"><blockquote class="blockquote"><p>
584 <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="identifier">InPlaceFactory</span><span class="special">&gt;</span>
585 <span class="keyword">explicit</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
586 <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">InPlaceFactory</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">f</span> <span class="special">);</span></code>
587 </p></blockquote></div>
588<div class="blockquote"><blockquote class="blockquote"><p>
589 <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="identifier">TypedInPlaceFactory</span><span class="special">&gt;</span>
590 <span class="keyword">explicit</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
591 <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">TypedInPlaceFactory</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">f</span> <span class="special">);</span></code>
592 </p></blockquote></div>
593<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
594<li class="listitem">
595 <span class="bold"><strong>Effect:</strong></span> Constructs an <code class="computeroutput"><span class="identifier">optional</span></code>
596 with a value of <code class="computeroutput"><span class="identifier">T</span></code> obtained
597 from the factory.
598 </li>
599<li class="listitem">
600 <span class="bold"><strong>Postconditions: </strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is <span class="underline">initialized</span>
601 and its value is <span class="emphasis"><em>directly given</em></span> from the factory
602 <code class="computeroutput"><span class="identifier">f</span></code> (i.e., the value <span class="underline">is not copied</span>).
603 </li>
604<li class="listitem">
605 <span class="bold"><strong>Throws:</strong></span> Whatever the <code class="computeroutput"><span class="identifier">T</span></code>
606 constructor called by the factory throws.
607 </li>
608<li class="listitem">
609 <span class="bold"><strong>Notes:</strong></span> See <a class="link" href="tutorial/in_place_factories.html" title="In-Place Factories">In-Place
610 Factories</a>
611 </li>
612<li class="listitem">
613 <span class="bold"><strong>Exception Safety:</strong></span> Exceptions can only
614 be thrown during the call to the <code class="computeroutput"><span class="identifier">T</span></code>
615 constructor used by the factory; in that case, this constructor has no
616 effect.
617 </li>
618<li class="listitem">
619 <span class="bold"><strong>Example:</strong></span>
620<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">C</span> <span class="special">{</span> <span class="identifier">C</span> <span class="special">(</span> <span class="keyword">char</span><span class="special">,</span> <span class="keyword">double</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="special">)</span> <span class="special">;</span> <span class="special">}</span> <span class="special">;</span>
621
622<span class="identifier">C</span> <span class="identifier">v</span><span class="special">(</span><span class="char">'A'</span><span class="special">,</span><span class="number">123.4</span><span class="special">,</span><span class="string">"hello"</span><span class="special">);</span>
623
624<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>
625<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>
626
627<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">x</span> <span class="special">==</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span>
628<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">y</span> <span class="special">==</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span>
629</pre>
630 </li>
631</ul></div>
632<p>
633 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
634 </p>
635<a name="reference_optional_operator_equal_none_t"></a><div class="blockquote"><blockquote class="blockquote"><p>
636 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&amp;</span>
637 <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> <span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span></code>
638 </p></blockquote></div>
639<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
640<li class="listitem">
641 <span class="bold"><strong>Effect:</strong></span> If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is initialized destroys its contained
642 value.
643 </li>
644<li class="listitem">
645 <span class="bold"><strong>Postconditions: </strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is uninitialized.
646 </li>
647</ul></div>
648<p>
649 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
650 </p>
651<a name="reference_optional_operator_equal_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
652 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&amp;</span>
653 <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>
654 <span class="keyword">const</span><span class="special">&amp;</span>
655 <span class="identifier">rhs</span> <span class="special">)</span>
656 <span class="special">;</span></code>
657 </p></blockquote></div>
658<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
659<li class="listitem">
660 <span class="bold"><strong>Effect:</strong></span> Assigns the value <code class="computeroutput"><span class="identifier">rhs</span></code> to an <code class="computeroutput"><span class="identifier">optional</span></code>.
661 </li>
662<li class="listitem">
663 <span class="bold"><strong>Postconditions: </strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is initialized and its value is a
664 <span class="emphasis"><em>copy</em></span> of <code class="computeroutput"><span class="identifier">rhs</span></code>.
665 </li>
666<li class="listitem">
667 <span class="bold"><strong>Throws:</strong></span> Whatever <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">)</span></code> or <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;)</span></code> throws.
668 </li>
669<li class="listitem">
670 <span class="bold"><strong>Notes:</strong></span> If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> was initialized, <code class="computeroutput"><span class="identifier">T</span></code>'s
671 assignment operator is used, otherwise, its copy-constructor is used.
672 </li>
673<li class="listitem">
674 <span class="bold"><strong>Exception Safety:</strong></span> In the event of an exception,
675 the initialization state of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is unchanged and its value unspecified
676 as far as <code class="computeroutput"><span class="identifier">optional</span></code> is concerned
677 (it is up to <code class="computeroutput"><span class="identifier">T</span></code>'s <code class="computeroutput"><span class="keyword">operator</span><span class="special">=()</span></code>).
678 If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
679 is initially uninitialized and <code class="computeroutput"><span class="identifier">T</span></code>'s
680 <span class="emphasis"><em>copy constructor</em></span> fails, <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is left properly uninitialized.
681 </li>
682<li class="listitem">
683 <span class="bold"><strong>Example:</strong></span>
684<pre class="programlisting"><span class="identifier">T</span> <span class="identifier">x</span><span class="special">;</span>
685<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">def</span> <span class="special">;</span>
686<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>
687
688<span class="identifier">T</span> <span class="identifier">y</span><span class="special">;</span>
689<span class="identifier">def</span> <span class="special">=</span> <span class="identifier">y</span> <span class="special">;</span>
690<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">def</span> <span class="special">==</span> <span class="identifier">y</span> <span class="special">)</span> <span class="special">;</span>
691<span class="identifier">opt</span> <span class="special">=</span> <span class="identifier">y</span> <span class="special">;</span>
692<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">opt</span> <span class="special">==</span> <span class="identifier">y</span> <span class="special">)</span> <span class="special">;</span>
693</pre>
694 </li>
695</ul></div>
696<p>
697 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
698 </p>
699<div class="blockquote"><blockquote class="blockquote"><p>
700 <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>
701 <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>
702 <span class="identifier">rhs</span> <span class="special">)</span>
703 <span class="special">;</span></code>
704 </p></blockquote></div>
705<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
706<li class="listitem">
707 <span class="bold"><strong>Effect:</strong></span> (Re)binds the wrapped reference.
708 </li>
709<li class="listitem">
710 <span class="bold"><strong>Postconditions: </strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is initialized and it references the
711 same object referenced by <code class="computeroutput"><span class="identifier">rhs</span></code>.
712 </li>
713<li class="listitem">
714 <span class="bold"><strong>Notes:</strong></span> If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> was initialized, it is <span class="emphasis"><em>rebound</em></span>
715 to the new object. See <a class="link" href="tutorial/rebinding_semantics_for_assignment_of_optional_references.html" title="Rebinding semantics for assignment of optional references">here</a>
716 for details on this behavior.
717 </li>
718<li class="listitem">
719 <span class="bold"><strong>Example:</strong></span>
720<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">a</span> <span class="special">=</span> <span class="number">1</span> <span class="special">;</span>
721<span class="keyword">int</span> <span class="identifier">b</span> <span class="special">=</span> <span class="number">2</span> <span class="special">;</span>
722<span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">ra</span> <span class="special">=</span> <span class="identifier">a</span> <span class="special">;</span>
723<span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">rb</span> <span class="special">=</span> <span class="identifier">b</span> <span class="special">;</span>
724<span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&amp;&gt;</span> <span class="identifier">def</span> <span class="special">;</span>
725<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>
726
727<span class="identifier">def</span> <span class="special">=</span> <span class="identifier">rb</span> <span class="special">;</span> <span class="comment">// binds 'def' to 'b' through 'rb'</span>
728<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">def</span> <span class="special">==</span> <span class="identifier">b</span> <span class="special">)</span> <span class="special">;</span>
729<span class="special">*</span><span class="identifier">def</span> <span class="special">=</span> <span class="identifier">a</span> <span class="special">;</span> <span class="comment">// changes the value of 'b' to a copy of the value of 'a'</span>
730<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">b</span> <span class="special">==</span> <span class="identifier">a</span> <span class="special">)</span> <span class="special">;</span>
731<span class="keyword">int</span> <span class="identifier">c</span> <span class="special">=</span> <span class="number">3</span><span class="special">;</span>
732<span class="keyword">int</span><span class="special">&amp;</span> <span class="identifier">rc</span> <span class="special">=</span> <span class="identifier">c</span> <span class="special">;</span>
733<span class="identifier">opt</span> <span class="special">=</span> <span class="identifier">rc</span> <span class="special">;</span> <span class="comment">// REBINDS to 'c' through 'rc'</span>
734<span class="identifier">c</span> <span class="special">=</span> <span class="number">4</span> <span class="special">;</span>
735<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">opt</span> <span class="special">==</span> <span class="number">4</span> <span class="special">)</span> <span class="special">;</span>
736</pre>
737 </li>
738</ul></div>
739<p>
740 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
741 </p>
742<a name="reference_optional_operator_move_equal_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
743 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&amp;</span>
744 <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>
745 <span class="special">)</span> <span class="special">;</span></code>
746 </p></blockquote></div>
747<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
748<li class="listitem">
749 <span class="bold"><strong>Effect:</strong></span> Moves the value <code class="computeroutput"><span class="identifier">rhs</span></code> to an <code class="computeroutput"><span class="identifier">optional</span></code>.
750 </li>
751<li class="listitem">
752 <span class="bold"><strong>Postconditions: </strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is initialized and its value is moved
753 from <code class="computeroutput"><span class="identifier">rhs</span></code>.
754 </li>
755<li class="listitem">
756 <span class="bold"><strong>Throws:</strong></span> Whatever <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">T</span><span class="special">&amp;&amp;</span> <span class="special">)</span></code>
757 or <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span><span class="identifier">T</span>
758 <span class="special">&amp;&amp;)</span></code> throws.
759 </li>
760<li class="listitem">
761 <span class="bold"><strong>Notes:</strong></span> If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> was initialized, <code class="computeroutput"><span class="identifier">T</span></code>'s
762 move-assignment operator is used, otherwise, its move-constructor is used.
763 </li>
764<li class="listitem">
765 <span class="bold"><strong>Exception Safety:</strong></span> In the event of an exception,
766 the initialization state of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is unchanged and its value unspecified
767 as far as <code class="computeroutput"><span class="identifier">optional</span></code> is concerned
768 (it is up to <code class="computeroutput"><span class="identifier">T</span></code>'s <code class="computeroutput"><span class="keyword">operator</span><span class="special">=()</span></code>).
769 If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
770 is initially uninitialized and <code class="computeroutput"><span class="identifier">T</span></code>'s
771 <span class="emphasis"><em>move constructor</em></span> fails, <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is left properly uninitialized.
772 </li>
773<li class="listitem">
774 <span class="bold"><strong>Example:</strong></span>
775<pre class="programlisting"><span class="identifier">T</span> <span class="identifier">x</span><span class="special">;</span>
776<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">def</span> <span class="special">;</span>
777<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>
778
779<span class="identifier">T</span> <span class="identifier">y1</span><span class="special">,</span> <span class="identifier">y2</span><span class="special">,</span> <span class="identifier">yR</span><span class="special">;</span>
780<span class="identifier">def</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">y1</span><span class="special">)</span> <span class="special">;</span>
781<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">def</span> <span class="special">==</span> <span class="identifier">yR</span> <span class="special">)</span> <span class="special">;</span>
782<span class="identifier">opt</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">y2</span><span class="special">)</span> <span class="special">;</span>
783<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">opt</span> <span class="special">==</span> <span class="identifier">yR</span> <span class="special">)</span> <span class="special">;</span>
784</pre>
785 </li>
786</ul></div>
787<p>
788 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
789 </p>
790<div class="blockquote"><blockquote class="blockquote"><p>
791 <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>
792 <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>
793 <span class="identifier">rhs</span> <span class="special">)</span>
794 <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span></code>
795 </p></blockquote></div>
796<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
797 <span class="bold"><strong>Notes:</strong></span> This assignment operator is deleted.
798 </li></ul></div>
799<p>
800 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
801 </p>
802<a name="reference_optional_operator_equal_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
803 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&amp;</span>
804 <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>
805 <span class="keyword">const</span><span class="special">&amp;</span>
806 <span class="identifier">rhs</span> <span class="special">)</span>
807 <span class="special">;</span></code>
808 </p></blockquote></div>
809<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
810<li class="listitem">
811 <span class="bold"><strong>Effect:</strong></span> Assigns another <code class="computeroutput"><span class="identifier">optional</span></code> to an <code class="computeroutput"><span class="identifier">optional</span></code>.
812 </li>
813<li class="listitem">
814 <span class="bold"><strong>Postconditions:</strong></span> If <code class="computeroutput"><span class="identifier">rhs</span></code>
815 is initialized, <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
816 is initialized and its value is a <span class="emphasis"><em>copy</em></span> of the value
817 of <code class="computeroutput"><span class="identifier">rhs</span></code>; else <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is
818 uninitialized.
819 </li>
820<li class="listitem">
821 <span class="bold"><strong>Throws:</strong></span> Whatever <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="keyword">operator</span><span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;)</span></code>
822 or <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span> <span class="identifier">T</span>
823 <span class="keyword">const</span><span class="special">&amp;</span>
824 <span class="special">)</span></code> throws.
825 </li>
826<li class="listitem">
827 <span class="bold"><strong>Notes:</strong></span> If both <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> and <code class="computeroutput"><span class="identifier">rhs</span></code>
828 are initially initialized, <code class="computeroutput"><span class="identifier">T</span></code>'s
829 <span class="emphasis"><em>assignment operator</em></span> is used. If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is initially initialized but <code class="computeroutput"><span class="identifier">rhs</span></code> is uninitialized, <code class="computeroutput"><span class="identifier">T</span></code>'s
830 [destructor] is called. If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is initially uninitialized but <code class="computeroutput"><span class="identifier">rhs</span></code> is initialized, <code class="computeroutput"><span class="identifier">T</span></code>'s
831 <span class="emphasis"><em>copy constructor</em></span> is called.
832 </li>
833<li class="listitem">
834 <span class="bold"><strong>Exception Safety:</strong></span> In the event of an exception,
835 the initialization state of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is unchanged and its value unspecified
836 as far as optional is concerned (it is up to <code class="computeroutput"><span class="identifier">T</span></code>'s
837 <code class="computeroutput"><span class="keyword">operator</span><span class="special">=()</span></code>).
838 If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
839 is initially uninitialized and <code class="computeroutput"><span class="identifier">T</span></code>'s
840 <span class="emphasis"><em>copy constructor</em></span> fails, <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is left properly uninitialized.
841 </li>
842<li class="listitem">
843 <span class="bold"><strong>Example:</strong></span>
844<pre class="programlisting"><span class="identifier">T</span> <span class="identifier">v</span><span class="special">;</span>
845<span class="identifier">optional</span><span class="special">&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>
846<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>
847
848<span class="identifier">opt</span> <span class="special">=</span> <span class="identifier">def</span> <span class="special">;</span>
849<span class="identifier">assert</span> <span class="special">(</span> <span class="special">!</span><span class="identifier">def</span> <span class="special">)</span> <span class="special">;</span>
850<span class="comment">// previous value (copy of 'v') destroyed from within 'opt'.</span>
851</pre>
852 </li>
853</ul></div>
854<p>
855 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
856 </p>
857<div class="blockquote"><blockquote class="blockquote"><p>
858 <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="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>
859 <span class="keyword">const</span><span class="special">&amp;</span>
860 <span class="identifier">rhs</span> <span class="special">)</span>
861 <span class="special">;</span></code>
862 </p></blockquote></div>
863<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
864<li class="listitem">
865 <span class="bold"><strong>Effect:</strong></span> (Re)binds thee wrapped reference.
866 </li>
867<li class="listitem">
868 <span class="bold"><strong>Postconditions:</strong></span> If <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code> is initialized, <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is initialized and it references the
869 same object referenced by <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code>; otherwise, <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is uninitialized (and references no
870 object).
871 </li>
872<li class="listitem">
873 <span class="bold"><strong>Notes:</strong></span> If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> was initialized and so is <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code>,
874 <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
875 is <span class="emphasis"><em>rebound</em></span> to the new object. See <a class="link" href="tutorial/rebinding_semantics_for_assignment_of_optional_references.html" title="Rebinding semantics for assignment of optional references">here</a>
876 for details on this behavior.
877 </li>
878<li class="listitem">
879 <span class="bold"><strong>Example:</strong></span>
880<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">a</span> <span class="special">=</span> <span class="number">1</span> <span class="special">;</span>
881<span class="keyword">int</span> <span class="identifier">b</span> <span class="special">=</span> <span class="number">2</span> <span class="special">;</span>
882<span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">ra</span> <span class="special">=</span> <span class="identifier">a</span> <span class="special">;</span>
883<span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">rb</span> <span class="special">=</span> <span class="identifier">b</span> <span class="special">;</span>
884<span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&amp;&gt;</span> <span class="identifier">def</span> <span class="special">;</span>
885<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>
886<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>
887
888<span class="identifier">def</span> <span class="special">=</span> <span class="identifier">orb</span> <span class="special">;</span> <span class="comment">// binds 'def' to 'b' through 'rb' wrapped within 'orb'</span>
889<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">def</span> <span class="special">==</span> <span class="identifier">b</span> <span class="special">)</span> <span class="special">;</span>
890<span class="special">*</span><span class="identifier">def</span> <span class="special">=</span> <span class="identifier">ora</span> <span class="special">;</span> <span class="comment">// changes the value of 'b' to a copy of the value of 'a'</span>
891<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">b</span> <span class="special">==</span> <span class="identifier">a</span> <span class="special">)</span> <span class="special">;</span>
892<span class="keyword">int</span> <span class="identifier">c</span> <span class="special">=</span> <span class="number">3</span><span class="special">;</span>
893<span class="keyword">int</span><span class="special">&amp;</span> <span class="identifier">rc</span> <span class="special">=</span> <span class="identifier">c</span> <span class="special">;</span>
894<span class="identifier">optional</span><span class="special">&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>
895<span class="identifier">ora</span> <span class="special">=</span> <span class="identifier">orc</span> <span class="special">;</span> <span class="comment">// REBINDS ora to 'c' through 'rc'</span>
896<span class="identifier">c</span> <span class="special">=</span> <span class="number">4</span> <span class="special">;</span>
897<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">ora</span> <span class="special">==</span> <span class="number">4</span> <span class="special">)</span> <span class="special">;</span>
898</pre>
899 </li>
900</ul></div>
901<p>
902 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
903 </p>
904<a name="reference_optional_operator_move_equal_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
905 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&amp;</span>
906 <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>
907 <span class="special">)</span> <span class="keyword">noexcept</span><span class="special">(</span></code><span class="emphasis"><em>see below</em></span><code class="computeroutput"><span class="special">);</span></code>
908 </p></blockquote></div>
909<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
910<li class="listitem">
911 <span class="bold"><strong>Effect:</strong></span> Move-assigns another <code class="computeroutput"><span class="identifier">optional</span></code> to an <code class="computeroutput"><span class="identifier">optional</span></code>.
912 </li>
913<li class="listitem">
914 <span class="bold"><strong>Postconditions:</strong></span> If <code class="computeroutput"><span class="identifier">rhs</span></code>
915 is initialized, <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
916 is initialized and its value is moved from <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code>, <code class="computeroutput"><span class="identifier">rhs</span></code>
917 remains initialized; else <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is uninitialized.
918 </li>
919<li class="listitem">
920 <span class="bold"><strong>Throws:</strong></span> Whatever <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="keyword">operator</span><span class="special">(</span> <span class="identifier">T</span><span class="special">&amp;&amp;</span>
921 <span class="special">)</span></code> or <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span>
922 <span class="identifier">T</span> <span class="special">&amp;&amp;</span>
923 <span class="special">)</span></code> throws.
924 </li>
925<li class="listitem">
926 <span class="bold"><strong>Notes:</strong></span> If both <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> and <code class="computeroutput"><span class="identifier">rhs</span></code>
927 are initially initialized, <code class="computeroutput"><span class="identifier">T</span></code>'s
928 <span class="emphasis"><em>move assignment operator</em></span> is used. If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is
929 initially initialized but <code class="computeroutput"><span class="identifier">rhs</span></code>
930 is uninitialized, <code class="computeroutput"><span class="identifier">T</span></code>'s [destructor]
931 is called. If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
932 is initially uninitialized but <code class="computeroutput"><span class="identifier">rhs</span></code>
933 is initialized, <code class="computeroutput"><span class="identifier">T</span></code>'s <span class="emphasis"><em>move
934 constructor</em></span> is called. The expression inside <code class="computeroutput"><span class="keyword">noexcept</span></code>
935 is equivalent to <code class="computeroutput"><span class="identifier">is_nothrow_move_constructible</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span>
936 <span class="special">&amp;&amp;</span> <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>.
937 </li>
938<li class="listitem">
939 <span class="bold"><strong>Exception Safety:</strong></span> In the event of an exception,
940 the initialization state of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is unchanged and its value unspecified
941 as far as optional is concerned (it is up to <code class="computeroutput"><span class="identifier">T</span></code>'s
942 <code class="computeroutput"><span class="keyword">operator</span><span class="special">=()</span></code>).
943 If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
944 is initially uninitialized and <code class="computeroutput"><span class="identifier">T</span></code>'s
945 <span class="emphasis"><em>move constructor</em></span> fails, <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is left properly uninitialized.
946 </li>
947<li class="listitem">
948 <span class="bold"><strong>Example:</strong></span>
949<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>
950<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>
951
952<span class="identifier">opt</span> <span class="special">=</span> <span class="identifier">def</span> <span class="special">;</span>
953<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">def</span> <span class="special">)</span> <span class="special">;</span>
954<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">opt</span> <span class="special">)</span> <span class="special">;</span>
955<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">opt</span> <span class="special">==</span> <span class="identifier">T</span><span class="special">(</span><span class="number">2</span><span class="special">)</span> <span class="special">)</span> <span class="special">;</span>
956</pre>
957 </li>
958</ul></div>
959<p>
960 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
961 </p>
962<div class="blockquote"><blockquote class="blockquote"><p>
963 <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="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>
964 <span class="identifier">rhs</span> <span class="special">)</span>
965 <span class="special">;</span></code>
966 </p></blockquote></div>
967<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
968 <span class="bold"><strong>Effect:</strong></span> Same as <code class="computeroutput"><span class="identifier">optional</span><span class="special">&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> <span class="special">)</span></code>.
969 </li></ul></div>
970<p>
971 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
972 </p>
973<a name="reference_optional_operator_equal_other_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
974 <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;</span> <span class="identifier">optional</span><span class="special">&amp;</span>
975 <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>
976 <span class="keyword">const</span><span class="special">&amp;</span>
977 <span class="identifier">rhs</span> <span class="special">)</span>
978 <span class="special">;</span></code>
979 </p></blockquote></div>
980<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
981<li class="listitem">
982 <span class="bold"><strong>Effect:</strong></span> Assigns another convertible optional
983 to an optional.
984 </li>
985<li class="listitem">
986 <span class="bold"><strong>Postconditions:</strong></span> If <code class="computeroutput"><span class="identifier">rhs</span></code>
987 is initialized, <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
988 is initialized and its value is a <span class="emphasis"><em>copy</em></span> of the value
989 of <code class="computeroutput"><span class="identifier">rhs</span></code> <span class="emphasis"><em>converted</em></span>
990 to type <code class="computeroutput"><span class="identifier">T</span></code>; else <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is
991 uninitialized.
992 </li>
993<li class="listitem">
994 <span class="bold"><strong>Throws:</strong></span> Whatever <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">U</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">)</span></code> or <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span>
995 <span class="identifier">U</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">)</span></code>
996 throws.
997 </li>
998<li class="listitem">
999 <span class="bold"><strong>Notes:</strong></span> If both <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> and rhs are initially initialized,
1000 <code class="computeroutput"><span class="identifier">T</span></code>'s <span class="emphasis"><em>assignment
1001 operator</em></span> (from <code class="computeroutput"><span class="identifier">U</span></code>)
1002 is used. If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1003 is initially initialized but <code class="computeroutput"><span class="identifier">rhs</span></code>
1004 is uninitialized, <code class="computeroutput"><span class="identifier">T</span></code>'s
1005 <span class="emphasis"><em>destructor</em></span> is called. If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is initially uninitialized but rhs
1006 is initialized, <code class="computeroutput"><span class="identifier">T</span></code>'s <span class="emphasis"><em>converting
1007 constructor</em></span> (from <code class="computeroutput"><span class="identifier">U</span></code>)
1008 is called.
1009 </li>
1010<li class="listitem">
1011 <span class="bold"><strong>Exception Safety:</strong></span> In the event of an exception,
1012 the initialization state of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is unchanged and its value unspecified
1013 as far as optional is concerned (it is up to <code class="computeroutput"><span class="identifier">T</span></code>'s
1014 <code class="computeroutput"><span class="keyword">operator</span><span class="special">=()</span></code>).
1015 If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1016 is initially uninitialized and <code class="computeroutput"><span class="identifier">T</span></code>'s
1017 converting constructor fails, <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is left properly uninitialized.
1018 </li>
1019<li class="listitem">
1020 <span class="bold"><strong>Example:</strong></span>
1021<pre class="programlisting"><span class="identifier">T</span> <span class="identifier">v</span><span class="special">;</span>
1022<span class="identifier">optional</span><span class="special">&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>
1023<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>
1024
1025<span class="identifier">opt1</span> <span class="special">=</span> <span class="identifier">opt0</span> <span class="special">;</span>
1026<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">opt1</span> <span class="special">==</span> <span class="keyword">static_cast</span><span class="special">&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>
1027</pre>
1028 </li>
1029</ul></div>
1030<p>
1031 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
1032 </p>
1033<a name="reference_optional_operator_move_equal_other_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
1034 <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;</span> <span class="identifier">optional</span><span class="special">&amp;</span>
1035 <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>
1036 <span class="identifier">rhs</span> <span class="special">)</span>
1037 <span class="special">;</span></code>
1038 </p></blockquote></div>
1039<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1040<li class="listitem">
1041 <span class="bold"><strong>Effect:</strong></span> Move-assigns another convertible
1042 optional to an optional.
1043 </li>
1044<li class="listitem">
1045 <span class="bold"><strong>Postconditions:</strong></span> If <code class="computeroutput"><span class="identifier">rhs</span></code>
1046 is initialized, <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1047 is initialized and its value is moved from the value of <code class="computeroutput"><span class="identifier">rhs</span></code>;
1048 else <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1049 is uninitialized.
1050 </li>
1051<li class="listitem">
1052 <span class="bold"><strong>Throws:</strong></span> Whatever <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">U</span><span class="special">&amp;&amp;</span> <span class="special">)</span></code>
1053 or <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span> <span class="identifier">U</span><span class="special">&amp;&amp;</span> <span class="special">)</span></code>
1054 throws.
1055 </li>
1056<li class="listitem">
1057 <span class="bold"><strong>Notes:</strong></span> If both <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> and <code class="computeroutput"><span class="identifier">rhs</span></code>
1058 are initially initialized, <code class="computeroutput"><span class="identifier">T</span></code>'s
1059 <span class="emphasis"><em>assignment operator</em></span> (from <code class="computeroutput"><span class="identifier">U</span><span class="special">&amp;&amp;</span></code>) is used. If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is initially initialized but <code class="computeroutput"><span class="identifier">rhs</span></code> is uninitialized, <code class="computeroutput"><span class="identifier">T</span></code>'s
1060 <span class="emphasis"><em>destructor</em></span> is called. If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is initially uninitialized but <code class="computeroutput"><span class="identifier">rhs</span></code> is initialized, <code class="computeroutput"><span class="identifier">T</span></code>'s
1061 <span class="emphasis"><em>converting constructor</em></span> (from <code class="computeroutput"><span class="identifier">U</span><span class="special">&amp;&amp;</span></code>) is called.
1062 </li>
1063<li class="listitem">
1064 <span class="bold"><strong>Exception Safety:</strong></span> In the event of an exception,
1065 the initialization state of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is unchanged and its value unspecified
1066 as far as optional is concerned (it is up to <code class="computeroutput"><span class="identifier">T</span></code>'s
1067 <code class="computeroutput"><span class="keyword">operator</span><span class="special">=()</span></code>).
1068 If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1069 is initially uninitialized and <code class="computeroutput"><span class="identifier">T</span></code>'s
1070 converting constructor fails, <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is left properly uninitialized.
1071 </li>
1072<li class="listitem">
1073 <span class="bold"><strong>Example:</strong></span>
1074<pre class="programlisting"><span class="identifier">T</span> <span class="identifier">v</span><span class="special">;</span>
1075<span class="identifier">optional</span><span class="special">&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>
1076<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>
1077
1078<span class="identifier">opt1</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">opt0</span><span class="special">)</span> <span class="special">;</span>
1079<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">opt1</span> <span class="special">==</span> <span class="keyword">static_cast</span><span class="special">&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>
1080</pre>
1081 </li>
1082</ul></div>
1083<p>
1084 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
1085 </p>
1086<a name="reference_optional_emplace"></a><div class="blockquote"><blockquote class="blockquote"><p>
1087 <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span><span class="special">...</span> <span class="identifier">Args</span><span class="special">&gt;</span> <span class="keyword">void</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
1088 <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> <span class="identifier">Args</span><span class="special">...&amp;&amp;</span>
1089 <span class="identifier">args</span> <span class="special">);</span></code>
1090 </p></blockquote></div>
1091<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1092<li class="listitem">
1093 <span class="bold"><strong>Requires:</strong></span> The compiler supports rvalue
1094 references and variadic templates.
1095 </li>
1096<li class="listitem">
1097 <span class="bold"><strong>Effect:</strong></span> If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is initialized calls <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span> <span class="special">=</span>
1098 <span class="identifier">none</span></code>. Then initializes in-place
1099 the contained value as if direct-initializing an object of type <code class="computeroutput"><span class="identifier">T</span></code> with <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">Args</span><span class="special">&gt;(</span><span class="identifier">args</span><span class="special">)...</span></code>.
1100 </li>
1101<li class="listitem">
1102 <span class="bold"><strong>Postconditions: </strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is <span class="underline">initialized</span>.
1103 </li>
1104<li class="listitem">
1105 <span class="bold"><strong>Throws:</strong></span> Whatever the selected <code class="computeroutput"><span class="identifier">T</span></code>'s constructor throws.
1106 </li>
1107<li class="listitem">
1108 <span class="bold"><strong>Notes:</strong></span> <code class="computeroutput"><span class="identifier">T</span></code>
1109 need not be <code class="computeroutput"><span class="identifier">MoveConstructible</span></code>
1110 or <code class="computeroutput"><span class="identifier">MoveAssignable</span></code>.
1111 </li>
1112<li class="listitem">
1113 <span class="bold"><strong>Exception Safety:</strong></span> If an exception is thrown
1114 during the initialization of <code class="computeroutput"><span class="identifier">T</span></code>,
1115 <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1116 is <span class="emphasis"><em>uninitialized</em></span>.
1117 </li>
1118</ul></div>
1119<p>
1120 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
1121 </p>
1122<a name="reference_optional_operator_equal_factory"></a><div class="blockquote"><blockquote class="blockquote"><p>
1123 <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="identifier">InPlaceFactory</span><span class="special">&gt;</span>
1124 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&amp;</span> <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>
1125 <span class="keyword">const</span><span class="special">&amp;</span>
1126 <span class="identifier">f</span> <span class="special">);</span></code>
1127 </p></blockquote></div>
1128<div class="blockquote"><blockquote class="blockquote"><p>
1129 <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="identifier">TypedInPlaceFactory</span><span class="special">&gt;</span>
1130 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&amp;</span> <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>
1131 <span class="keyword">const</span><span class="special">&amp;</span>
1132 <span class="identifier">f</span> <span class="special">);</span></code>
1133 </p></blockquote></div>
1134<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1135<li class="listitem">
1136 <span class="bold"><strong>Effect:</strong></span> Assigns an <code class="computeroutput"><span class="identifier">optional</span></code>
1137 with a value of <code class="computeroutput"><span class="identifier">T</span></code> obtained
1138 from the factory.
1139 </li>
1140<li class="listitem">
1141 <span class="bold"><strong>Postconditions: </strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is <span class="underline">initialized</span>
1142 and its value is <span class="emphasis"><em>directly given</em></span> from the factory
1143 <code class="computeroutput"><span class="identifier">f</span></code> (i.e., the value <span class="underline">is not copied</span>).
1144 </li>
1145<li class="listitem">
1146 <span class="bold"><strong>Throws:</strong></span> Whatever the <code class="computeroutput"><span class="identifier">T</span></code>
1147 constructor called by the factory throws.
1148 </li>
1149<li class="listitem">
1150 <span class="bold"><strong>Notes:</strong></span> See <a class="link" href="tutorial/in_place_factories.html" title="In-Place Factories">In-Place
1151 Factories</a>
1152 </li>
1153<li class="listitem">
1154 <span class="bold"><strong>Exception Safety:</strong></span> Exceptions can only
1155 be thrown during the call to the <code class="computeroutput"><span class="identifier">T</span></code>
1156 constructor used by the factory; in that case, the <code class="computeroutput"><span class="identifier">optional</span></code>
1157 object will be reset to be <span class="emphasis"><em>uninitialized</em></span>.
1158 </li>
1159</ul></div>
1160<p>
1161 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
1162 </p>
1163<a name="reference_optional_reset_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
1164 <code class="computeroutput"><span class="keyword">void</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
1165 <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>
1166 </p></blockquote></div>
1167<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
1168 <span class="bold"><strong>Deprecated:</strong></span> same as <code class="computeroutput"><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">T</span>
1169 <span class="keyword">const</span><span class="special">&amp;</span>
1170 <span class="identifier">v</span><span class="special">)</span>
1171 <span class="special">;</span></code>
1172 </li></ul></div>
1173<p>
1174 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
1175 </p>
1176<a name="reference_optional_reset"></a><div class="blockquote"><blockquote class="blockquote"><p>
1177 <code class="computeroutput"><span class="keyword">void</span> <span class="identifier">optional</span><span class="special">&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> <span class="special">;</span></code>
1178 </p></blockquote></div>
1179<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
1180 <span class="bold"><strong>Deprecated:</strong></span> Same as <code class="computeroutput"><span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">none_t</span> <span class="special">);</span></code>
1181 </li></ul></div>
1182<p>
1183 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
1184 </p>
1185<a name="reference_optional_get"></a><div class="blockquote"><blockquote class="blockquote"><p>
1186 <code class="computeroutput"><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
1187 <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>
1188 </p></blockquote></div>
1189<div class="blockquote"><blockquote class="blockquote"><p>
1190 <code class="computeroutput"><span class="identifier">T</span><span class="special">&amp;</span>
1191 <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>
1192 </p></blockquote></div>
1193<div class="blockquote"><blockquote class="blockquote"><p>
1194 <code class="computeroutput"><span class="keyword">inline</span> <span class="identifier">T</span>
1195 <span class="keyword">const</span><span class="special">&amp;</span>
1196 <span class="identifier">get</span> <span class="special">(</span>
1197 <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>
1198 </p></blockquote></div>
1199<div class="blockquote"><blockquote class="blockquote"><p>
1200 <code class="computeroutput"><span class="keyword">inline</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">get</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
1201 <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;</span>
1202 <span class="special">&amp;)</span> <span class="special">;</span></code>
1203 </p></blockquote></div>
1204<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1205<li class="listitem">
1206 <span class="bold"><strong>Requires:</strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is initialized
1207 </li>
1208<li class="listitem">
1209 <span class="bold"><strong>Returns:</strong></span> A reference to the contained
1210 value
1211 </li>
1212<li class="listitem">
1213 <span class="bold"><strong>Throws:</strong></span> Nothing.
1214 </li>
1215<li class="listitem">
1216 <span class="bold"><strong>Notes:</strong></span> The requirement is asserted via
1217 <code class="computeroutput"><span class="identifier">BOOST_ASSERT</span><span class="special">()</span></code>.
1218 </li>
1219</ul></div>
1220<p>
1221 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
1222 </p>
1223<div class="blockquote"><blockquote class="blockquote"><p>
1224 <code class="computeroutput"><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&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>
1225 </p></blockquote></div>
1226<div class="blockquote"><blockquote class="blockquote"><p>
1227 <code class="computeroutput"><span class="identifier">T</span><span class="special">&amp;</span>
1228 <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>
1229 </p></blockquote></div>
1230<div class="blockquote"><blockquote class="blockquote"><p>
1231 <code class="computeroutput"><span class="keyword">inline</span> <span class="identifier">T</span>
1232 <span class="keyword">const</span><span class="special">&amp;</span>
1233 <span class="identifier">get</span> <span class="special">(</span>
1234 <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="special">)</span> <span class="special">;</span></code>
1235 </p></blockquote></div>
1236<div class="blockquote"><blockquote class="blockquote"><p>
1237 <code class="computeroutput"><span class="keyword">inline</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">get</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>
1238 <span class="special">&amp;)</span> <span class="special">;</span></code>
1239 </p></blockquote></div>
1240<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1241<li class="listitem">
1242 <span class="bold"><strong>Requires: </strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is initialized
1243 </li>
1244<li class="listitem">
1245 <span class="bold"><strong>Returns:</strong></span> <span class="underline">The</span>
1246 reference contained.
1247 </li>
1248<li class="listitem">
1249 <span class="bold"><strong>Throws:</strong></span> Nothing.
1250 </li>
1251<li class="listitem">
1252 <span class="bold"><strong>Notes:</strong></span> The requirement is asserted via
1253 <code class="computeroutput"><span class="identifier">BOOST_ASSERT</span><span class="special">()</span></code>.
1254 </li>
1255</ul></div>
1256<p>
1257 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
1258 </p>
1259<a name="reference_optional_operator_asterisk"></a><div class="blockquote"><blockquote class="blockquote"><p>
1260 <code class="computeroutput"><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
1261 <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="keyword">const</span><span class="special">&amp;</span> <span class="special">;</span></code>
1262 </p></blockquote></div>
1263<div class="blockquote"><blockquote class="blockquote"><p>
1264 <code class="computeroutput"><span class="identifier">T</span><span class="special">&amp;</span>
1265 <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>
1266 </p></blockquote></div>
1267<div class="blockquote"><blockquote class="blockquote"><p>
1268 <code class="computeroutput"><span class="identifier">T</span><span class="special">&amp;&amp;</span>
1269 <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>
1270 </p></blockquote></div>
1271<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1272<li class="listitem">
1273 <span class="bold"><strong>Requires:</strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is initialized
1274 </li>
1275<li class="listitem">
1276 <span class="bold"><strong>Returns:</strong></span> A reference to the contained
1277 value
1278 </li>
1279<li class="listitem">
1280 <span class="bold"><strong>Throws:</strong></span> Nothing.
1281 </li>
1282<li class="listitem">
1283 <span class="bold"><strong>Notes:</strong></span> The requirement is asserted via
1284 <code class="computeroutput"><span class="identifier">BOOST_ASSERT</span><span class="special">()</span></code>.
1285 On compilers that do not support ref-qualifiers on member functions these
1286 three overloads are replaced with the classical two: a <code class="computeroutput"><span class="keyword">const</span></code>
1287 and non-<code class="computeroutput"><span class="keyword">const</span></code> member functions.
1288 </li>
1289<li class="listitem">
1290 <span class="bold"><strong>Example:</strong></span>
1291<pre class="programlisting"><span class="identifier">T</span> <span class="identifier">v</span> <span class="special">;</span>
1292<span class="identifier">optional</span><span class="special">&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>
1293<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>
1294<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">u</span> <span class="special">==</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span>
1295<span class="identifier">T</span> <span class="identifier">w</span> <span class="special">;</span>
1296<span class="special">*</span><span class="identifier">opt</span> <span class="special">=</span> <span class="identifier">w</span> <span class="special">;</span>
1297<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">opt</span> <span class="special">==</span> <span class="identifier">w</span> <span class="special">)</span> <span class="special">;</span>
1298</pre>
1299 </li>
1300</ul></div>
1301<p>
1302 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
1303 </p>
1304<div class="blockquote"><blockquote class="blockquote"><p>
1305 <code class="computeroutput"><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&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="keyword">const</span><span class="special">&amp;</span> <span class="special">;</span></code>
1306 </p></blockquote></div>
1307<div class="blockquote"><blockquote class="blockquote"><p>
1308 <code class="computeroutput"><span class="identifier">T</span> <span class="special">&amp;</span>
1309 <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">&amp;</span> <span class="special">;</span></code>
1310 </p></blockquote></div>
1311<div class="blockquote"><blockquote class="blockquote"><p>
1312 <code class="computeroutput"><span class="identifier">T</span> <span class="special">&amp;</span>
1313 <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">&amp;&amp;</span> <span class="special">;</span></code>
1314 </p></blockquote></div>
1315<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1316<li class="listitem">
1317 <span class="bold"><strong>Requires: </strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is initialized
1318 </li>
1319<li class="listitem">
1320 <span class="bold"><strong>Returns:</strong></span> <span class="underline">The</span>
1321 reference contained.
1322 </li>
1323<li class="listitem">
1324 <span class="bold"><strong>Throws:</strong></span> Nothing.
1325 </li>
1326<li class="listitem">
1327 <span class="bold"><strong>Notes:</strong></span> The requirement is asserted via
1328 <code class="computeroutput"><span class="identifier">BOOST_ASSERT</span><span class="special">()</span></code>.
1329 On compilers that do not support ref-qualifiers on member functions these
1330 three overloads are replaced with the classical two: a <code class="computeroutput"><span class="keyword">const</span></code>
1331 and non-<code class="computeroutput"><span class="keyword">const</span></code> member functions.
1332 </li>
1333<li class="listitem">
1334 <span class="bold"><strong>Example:</strong></span>
1335<pre class="programlisting"><span class="identifier">T</span> <span class="identifier">v</span> <span class="special">;</span>
1336<span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">vref</span> <span class="special">=</span> <span class="identifier">v</span> <span class="special">;</span>
1337<span class="identifier">optional</span><span class="special">&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>
1338<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>
1339<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">vref2</span> <span class="special">==</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span>
1340<span class="special">++</span> <span class="identifier">v</span> <span class="special">;</span>
1341<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">opt</span> <span class="special">==</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span>
1342</pre>
1343 </li>
1344</ul></div>
1345<p>
1346 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
1347 </p>
1348<a name="reference_optional_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
1349 <code class="computeroutput"><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&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>
1350 </p></blockquote></div>
1351<div class="blockquote"><blockquote class="blockquote"><p>
1352 <code class="computeroutput"><span class="identifier">T</span><span class="special">&amp;</span>
1353 <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>
1354 </p></blockquote></div>
1355<div class="blockquote"><blockquote class="blockquote"><p>
1356 <code class="computeroutput"><span class="identifier">T</span><span class="special">&amp;&amp;</span>
1357 <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>
1358 </p></blockquote></div>
1359<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1360<li class="listitem">
1361 <span class="bold"><strong>Returns:</strong></span> A reference to the contained
1362 value, if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1363 is initialized.
1364 </li>
1365<li class="listitem">
1366 <span class="bold"><strong>Throws:</strong></span> An instance of <code class="computeroutput"><span class="identifier">bad_optional_access</span></code>,
1367 if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1368 is not initialized.
1369 </li>
1370<li class="listitem">
1371 <span class="bold"><strong>Notes:</strong></span> On compilers that do not support
1372 ref-qualifiers on member functions these three overloads are replaced with
1373 the classical two: a <code class="computeroutput"><span class="keyword">const</span></code>
1374 and non-<code class="computeroutput"><span class="keyword">const</span></code> member functions.
1375 </li>
1376<li class="listitem">
1377 <span class="bold"><strong>Example:</strong></span>
1378<pre class="programlisting"><span class="identifier">T</span> <span class="identifier">v</span> <span class="special">;</span>
1379<span class="identifier">optional</span><span class="special">&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>
1380<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">o1</span><span class="special">.</span><span class="identifier">value</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">v</span> <span class="special">);</span>
1381
1382<span class="keyword">try</span> <span class="special">{</span>
1383 <span class="identifier">o0</span><span class="special">.</span><span class="identifier">value</span><span class="special">();</span> <span class="comment">// throws</span>
1384 <span class="identifier">assert</span> <span class="special">(</span> <span class="keyword">false</span> <span class="special">);</span>
1385<span class="special">}</span>
1386<span class="keyword">catch</span><span class="special">(</span><span class="identifier">bad_optional_access</span><span class="special">&amp;)</span> <span class="special">{</span>
1387 <span class="identifier">assert</span> <span class="special">(</span> <span class="keyword">true</span> <span class="special">);</span>
1388<span class="special">}</span>
1389</pre>
1390 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
1391 </li>
1392</ul></div>
1393<a name="reference_optional_value_or"></a><div class="blockquote"><blockquote class="blockquote"><p>
1394 <code class="computeroutput"><span class="keyword">template</span><span class="special">&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>
1395 <span class="identifier">v</span><span class="special">)</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">;</span></code>
1396 </p></blockquote></div>
1397<div class="blockquote"><blockquote class="blockquote"><p>
1398 <code class="computeroutput"><span class="keyword">template</span><span class="special">&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>
1399 <span class="identifier">v</span><span class="special">)</span> <span class="special">&amp;&amp;</span> <span class="special">;</span></code>
1400 </p></blockquote></div>
1401<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1402<li class="listitem">
1403 <span class="bold"><strong>Requires:</strong></span> <code class="computeroutput"><span class="identifier">T</span></code>
1404 is CopyConstructible.
1405 </li>
1406<li class="listitem">
1407 <span class="bold"><strong>Returns:</strong></span> First overload: <code class="computeroutput"><span class="keyword">bool</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span> <span class="special">?</span> <span class="special">**</span><span class="keyword">this</span> <span class="special">:</span> <span class="keyword">static_cast</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;(</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>.
1408 second overload: <code class="computeroutput"><span class="keyword">bool</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span> <span class="special">?</span>
1409 <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(**</span><span class="keyword">this</span><span class="special">)</span> <span class="special">:</span>
1410 <span class="keyword">static_cast</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;(</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>.
1411 </li>
1412<li class="listitem">
1413 <span class="bold"><strong>Throws:</strong></span> Any exception thrown by the selected
1414 constructor of <code class="computeroutput"><span class="identifier">T</span></code>.
1415 </li>
1416<li class="listitem">
1417 <span class="bold"><strong>Notes:</strong></span> On compilers that do not support
1418 ref-qualifiers on member functions these three overloads are replaced with
1419 the classical two: a <code class="computeroutput"><span class="keyword">const</span></code>
1420 and non-<code class="computeroutput"><span class="keyword">const</span></code> member functions.
1421 On compilers without rvalue reference support the type of <code class="computeroutput"><span class="identifier">v</span></code> becomes <code class="computeroutput"><span class="identifier">U</span>
1422 <span class="keyword">const</span><span class="special">&amp;</span></code>.
1423 </li>
1424</ul></div>
1425<p>
1426 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
1427 </p>
1428<a name="reference_optional_get_value_or_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
1429 <code class="computeroutput"><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
1430 <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>
1431 <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>
1432 </p></blockquote></div>
1433<div class="blockquote"><blockquote class="blockquote"><p>
1434 <code class="computeroutput"><span class="identifier">T</span><span class="special">&amp;</span>
1435 <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>
1436 <span class="keyword">default</span> <span class="special">)</span>
1437 <span class="special">;</span></code>
1438 </p></blockquote></div>
1439<div class="blockquote"><blockquote class="blockquote"><p>
1440 <code class="computeroutput"><span class="keyword">inline</span> <span class="identifier">T</span>
1441 <span class="keyword">const</span><span class="special">&amp;</span>
1442 <span class="identifier">get_optional_value_or</span> <span class="special">(</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="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>
1444 </p></blockquote></div>
1445<div class="blockquote"><blockquote class="blockquote"><p>
1446 <code class="computeroutput"><span class="keyword">inline</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">get_optional_value_or</span>
1447 <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
1448 <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;&amp;</span>
1449 <span class="identifier">o</span><span class="special">,</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="keyword">default</span> <span class="special">)</span> <span class="special">;</span></code>
1450 </p></blockquote></div>
1451<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1452<li class="listitem">
1453 <span class="bold"><strong>Deprecated:</strong></span> Use <code class="computeroutput"><span class="identifier">value_or</span><span class="special">()</span></code> instead.
1454 </li>
1455<li class="listitem">
1456 <span class="bold"><strong>Returns:</strong></span> A reference to the contained
1457 value, if any, or <code class="computeroutput"><span class="keyword">default</span></code>.
1458 </li>
1459<li class="listitem">
1460 <span class="bold"><strong>Throws:</strong></span> Nothing.
1461 </li>
1462<li class="listitem">
1463 <span class="bold"><strong>Example:</strong></span>
1464<pre class="programlisting"><span class="identifier">T</span> <span class="identifier">v</span><span class="special">,</span> <span class="identifier">z</span> <span class="special">;</span>
1465<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">def</span><span class="special">;</span>
1466<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>
1467<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">y</span> <span class="special">==</span> <span class="identifier">z</span> <span class="special">)</span> <span class="special">;</span>
1468
1469<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>
1470<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>
1471<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">u</span> <span class="special">==</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span>
1472<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">u</span> <span class="special">!=</span> <span class="identifier">z</span> <span class="special">)</span> <span class="special">;</span>
1473</pre>
1474 </li>
1475</ul></div>
1476<p>
1477 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
1478 </p>
1479<a name="reference_optional_get_ptr"></a><div class="blockquote"><blockquote class="blockquote"><p>
1480 <code class="computeroutput"><span class="identifier">T</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
1481 <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="keyword">const</span> <span class="special">;</span></code>
1482 </p></blockquote></div>
1483<div class="blockquote"><blockquote class="blockquote"><p>
1484 <code class="computeroutput"><span class="identifier">T</span><span class="special">*</span>
1485 <span class="identifier">optional</span><span class="special">&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>
1486 </p></blockquote></div>
1487<div class="blockquote"><blockquote class="blockquote"><p>
1488 <code class="computeroutput"><span class="keyword">inline</span> <span class="identifier">T</span>
1489 <span class="keyword">const</span><span class="special">*</span> <span class="identifier">get_pointer</span> <span class="special">(</span>
1490 <span class="identifier">optional</span><span class="special">&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>
1491 </p></blockquote></div>
1492<div class="blockquote"><blockquote class="blockquote"><p>
1493 <code class="computeroutput"><span class="keyword">inline</span> <span class="identifier">T</span><span class="special">*</span> <span class="identifier">get_pointer</span>
1494 <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
1495 <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;</span>
1496 <span class="special">&amp;)</span> <span class="special">;</span></code>
1497 </p></blockquote></div>
1498<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1499<li class="listitem">
1500 <span class="bold"><strong>Returns:</strong></span> If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is initialized, a pointer to the contained
1501 value; else <code class="computeroutput"><span class="number">0</span></code> (<span class="emphasis"><em>null</em></span>).
1502 </li>
1503<li class="listitem">
1504 <span class="bold"><strong>Throws:</strong></span> Nothing.
1505 </li>
1506<li class="listitem">
1507 <span class="bold"><strong>Notes:</strong></span> The contained value is permanently
1508 stored within <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
1509 so you should not hold nor delete this pointer
1510 </li>
1511<li class="listitem">
1512 <span class="bold"><strong>Example:</strong></span>
1513<pre class="programlisting"><span class="identifier">T</span> <span class="identifier">v</span><span class="special">;</span>
1514<span class="identifier">optional</span><span class="special">&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>
1515<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>
1516<span class="identifier">T</span><span class="special">*</span> <span class="identifier">p</span> <span class="special">=</span> <span class="identifier">opt</span><span class="special">.</span><span class="identifier">get_ptr</span><span class="special">()</span> <span class="special">;</span>
1517<span class="identifier">T</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">cp</span> <span class="special">=</span> <span class="identifier">copt</span><span class="special">.</span><span class="identifier">get_ptr</span><span class="special">();</span>
1518<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">p</span> <span class="special">==</span> <span class="identifier">get_pointer</span><span class="special">(</span><span class="identifier">opt</span><span class="special">)</span> <span class="special">);</span>
1519<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">cp</span> <span class="special">==</span> <span class="identifier">get_pointer</span><span class="special">(</span><span class="identifier">copt</span><span class="special">)</span> <span class="special">)</span> <span class="special">;</span>
1520</pre>
1521 </li>
1522</ul></div>
1523<p>
1524 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
1525 </p>
1526<a name="reference_optional_operator_arrow"></a><div class="blockquote"><blockquote class="blockquote"><p>
1527 <code class="computeroutput"><span class="identifier">T</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
1528 <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>
1529 <span class="keyword">const</span> <span class="special">;</span></code>
1530 </p></blockquote></div>
1531<div class="blockquote"><blockquote class="blockquote"><p>
1532 <code class="computeroutput"><span class="identifier">T</span><span class="special">*</span>
1533 <span class="identifier">optional</span><span class="special">&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">-&gt;()</span> <span class="special">;</span></code>
1534 </p></blockquote></div>
1535<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1536<li class="listitem">
1537 <span class="bold"><strong>Requires: </strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is initialized.
1538 </li>
1539<li class="listitem">
1540 <span class="bold"><strong>Returns:</strong></span> A pointer to the contained value.
1541 </li>
1542<li class="listitem">
1543 <span class="bold"><strong>Throws:</strong></span> Nothing.
1544 </li>
1545<li class="listitem">
1546 <span class="bold"><strong>Notes:</strong></span> The requirement is asserted via
1547 <code class="computeroutput"><span class="identifier">BOOST_ASSERT</span><span class="special">()</span></code>.
1548 </li>
1549<li class="listitem">
1550 <span class="bold"><strong>Example:</strong></span>
1551<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">X</span> <span class="special">{</span> <span class="keyword">int</span> <span class="identifier">mdata</span> <span class="special">;</span> <span class="special">}</span> <span class="special">;</span>
1552<span class="identifier">X</span> <span class="identifier">x</span> <span class="special">;</span>
1553<span class="identifier">optional</span><span class="special">&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>
1554<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>
1555</pre>
1556 </li>
1557</ul></div>
1558<p>
1559 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
1560 </p>
1561<a name="reference_optional_operator_bool"></a><div class="blockquote"><blockquote class="blockquote"><p>
1562 <code class="computeroutput"><span class="keyword">explicit</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="keyword">operator</span> <span class="keyword">bool</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">;</span></code>
1563 </p></blockquote></div>
1564<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1565<li class="listitem">
1566 <span class="bold"><strong>Returns:</strong></span> <code class="computeroutput"><span class="identifier">get_ptr</span><span class="special">()</span> <span class="special">!=</span> <span class="number">0</span></code>.
1567 </li>
1568<li class="listitem">
1569 <span class="bold"><strong>Throws:</strong></span> Nothing.
1570 </li>
1571<li class="listitem">
1572 <span class="bold"><strong>Notes:</strong></span> On compilers that do not support
1573 explicit conversion operators this falls back to safe-bool idiom.
1574 </li>
1575<li class="listitem">
1576 <span class="bold"><strong>Example:</strong></span>
1577<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>
1578<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">def</span> <span class="special">==</span> <span class="number">0</span> <span class="special">);</span>
1579<span class="identifier">optional</span><span class="special">&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>
1580<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">opt</span> <span class="special">);</span>
1581<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">opt</span> <span class="special">!=</span> <span class="number">0</span> <span class="special">);</span>
1582</pre>
1583 </li>
1584</ul></div>
1585<p>
1586 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
1587 </p>
1588<a name="reference_optional_operator_not"></a><div class="blockquote"><blockquote class="blockquote"><p>
1589 <code class="computeroutput"><span class="keyword">bool</span> <span class="identifier">optional</span><span class="special">&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> <span class="special">;</span></code>
1590 </p></blockquote></div>
1591<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1592<li class="listitem">
1593 <span class="bold"><strong>Returns:</strong></span> If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is uninitialized, <code class="computeroutput"><span class="keyword">true</span></code>;
1594 else <code class="computeroutput"><span class="keyword">false</span></code>.
1595 </li>
1596<li class="listitem">
1597 <span class="bold"><strong>Notes:</strong></span> This operator is provided for those
1598 compilers which can't use the <span class="emphasis"><em>unspecified-bool-type operator</em></span>
1599 in certain boolean contexts.
1600 </li>
1601<li class="listitem">
1602 <span class="bold"><strong>Example:</strong></span>
1603<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>
1604<span class="identifier">assert</span> <span class="special">(</span> <span class="special">!</span><span class="identifier">opt</span> <span class="special">);</span>
1605<span class="special">*</span><span class="identifier">opt</span> <span class="special">=</span> <span class="identifier">some_T</span> <span class="special">;</span>
1606
1607<span class="comment">// Notice the "double-bang" idiom here.</span>
1608<span class="identifier">assert</span> <span class="special">(</span> <span class="special">!!</span><span class="identifier">opt</span> <span class="special">)</span> <span class="special">;</span>
1609</pre>
1610 </li>
1611</ul></div>
1612<p>
1613 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
1614 </p>
1615<a name="reference_optional_is_initialized"></a><div class="blockquote"><blockquote class="blockquote"><p>
1616 <code class="computeroutput"><span class="keyword">bool</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">is_initialized</span><span class="special">()</span>
1617 <span class="keyword">const</span> <span class="special">;</span></code>
1618 </p></blockquote></div>
1619<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
1620 <span class="bold"><strong>Deprecated:</strong></span> Same as <code class="computeroutput"><span class="keyword">explicit</span>
1621 <span class="keyword">operator</span> <span class="keyword">bool</span>
1622 <span class="special">()</span> <span class="special">;</span></code>
1623 </li></ul></div>
1624<p>
1625 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
1626 </p>
1627<h4>
1628<a name="boost_optional.detailed_semantics.h1"></a>
1629 <span class="phrase"><a name="boost_optional.detailed_semantics.free_functions"></a></span><a class="link" href="detailed_semantics.html#boost_optional.detailed_semantics.free_functions">Free
1630 functions</a>
1631 </h4>
1632<p>
1633 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
1634 </p>
1635<a name="reference_make_optional_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
1636 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&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>
1637 </p></blockquote></div>
1638<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1639<li class="listitem">
1640 <span class="bold"><strong>Returns: </strong></span> <code class="computeroutput"><span class="identifier">optional</span><span class="special">&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> type
1641 <code class="computeroutput"><span class="identifier">T</span></code> of <code class="computeroutput"><span class="identifier">v</span></code>.
1642 </li>
1643<li class="listitem">
1644 <span class="bold"><strong>Example:</strong></span>
1645<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>
1646
1647<span class="identifier">foo</span> <span class="special">(</span> <span class="identifier">make_optional</span><span class="special">(</span><span class="number">1</span><span class="special">+</span><span class="number">1</span><span class="special">)</span> <span class="special">)</span> <span class="special">;</span> <span class="comment">// Creates an optional&lt;int&gt;</span>
1648</pre>
1649 </li>
1650</ul></div>
1651<p>
1652 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
1653 </p>
1654<a name="reference_make_optional_bool_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
1655 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&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> <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>
1656 </p></blockquote></div>
1657<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1658<li class="listitem">
1659 <span class="bold"><strong>Returns: </strong></span> <code class="computeroutput"><span class="identifier">optional</span><span class="special">&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>
1660 for the <span class="emphasis"><em>deduced</em></span> type <code class="computeroutput"><span class="identifier">T</span></code>
1661 of <code class="computeroutput"><span class="identifier">v</span></code>.
1662 </li>
1663<li class="listitem">
1664 <span class="bold"><strong>Example:</strong></span>
1665<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>
1666<span class="special">{</span>
1667 <span class="keyword">double</span> <span class="identifier">val</span> <span class="special">=</span> <span class="identifier">compute_foo</span><span class="special">();</span>
1668 <span class="keyword">return</span> <span class="identifier">make_optional</span><span class="special">(</span><span class="identifier">is_not_nan_and_finite</span><span class="special">(</span><span class="identifier">val</span><span class="special">),</span><span class="identifier">val</span><span class="special">);</span>
1669<span class="special">}</span>
1670
1671<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>
1672<span class="keyword">if</span> <span class="special">(</span> <span class="special">!</span><span class="identifier">v</span> <span class="special">)</span>
1673 <span class="identifier">error</span><span class="special">(</span><span class="string">"foo wasn't computed"</span><span class="special">);</span>
1674</pre>
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_operator_compare_equal_optional_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
1681 <code class="computeroutput"><span class="keyword">bool</span> <span class="keyword">operator</span>
1682 <span class="special">==</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&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>
1683 <span class="keyword">const</span><span class="special">&amp;</span>
1684 <span class="identifier">y</span> <span class="special">);</span></code>
1685 </p></blockquote></div>
1686<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1687<li class="listitem">
1688 <span class="bold"><strong>Requires:</strong></span> <code class="computeroutput"><span class="identifier">T</span></code>
1689 shall meet requirements of <code class="computeroutput"><span class="identifier">EqualityComparable</span></code>.
1690 </li>
1691<li class="listitem">
1692 <span class="bold"><strong>Returns:</strong></span> If both <code class="computeroutput"><span class="identifier">x</span></code>
1693 and <code class="computeroutput"><span class="identifier">y</span></code> are initialized,
1694 <code class="computeroutput"><span class="special">(*</span><span class="identifier">x</span>
1695 <span class="special">==</span> <span class="special">*</span><span class="identifier">y</span><span class="special">)</span></code>. If
1696 only <code class="computeroutput"><span class="identifier">x</span></code> or <code class="computeroutput"><span class="identifier">y</span></code> is initialized, <code class="computeroutput"><span class="keyword">false</span></code>.
1697 If both are uninitialized, <code class="computeroutput"><span class="keyword">true</span></code>.
1698 </li>
1699<li class="listitem">
1700 <span class="bold"><strong>Throws:</strong></span> Nothing.
1701 </li>
1702<li class="listitem">
1703 <span class="bold"><strong>Notes:</strong></span> Pointers have shallow relational
1704 operators while <code class="computeroutput"><span class="identifier">optional</span></code>
1705 has deep relational operators. Do not use <code class="computeroutput"><span class="keyword">operator</span>
1706 <span class="special">==</span></code> directly in generic code which
1707 expect to be given either an <code class="computeroutput"><span class="identifier">optional</span><span class="special">&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>
1708 instead
1709 </li>
1710<li class="listitem">
1711 <span class="bold"><strong>Example:</strong></span>
1712<pre class="programlisting"><span class="identifier">T</span> <span class="identifier">x</span><span class="special">(</span><span class="number">12</span><span class="special">);</span>
1713<span class="identifier">T</span> <span class="identifier">y</span><span class="special">(</span><span class="number">12</span><span class="special">);</span>
1714<span class="identifier">T</span> <span class="identifier">z</span><span class="special">(</span><span class="number">21</span><span class="special">);</span>
1715<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">def0</span> <span class="special">;</span>
1716<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>
1717<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>
1718<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>
1719<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">optZ</span><span class="special">(</span><span class="identifier">z</span><span class="special">);</span>
1720
1721<span class="comment">// Identity always hold</span>
1722<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">def0</span> <span class="special">==</span> <span class="identifier">def0</span> <span class="special">);</span>
1723<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">optX</span> <span class="special">==</span> <span class="identifier">optX</span> <span class="special">);</span>
1724
1725<span class="comment">// Both uninitialized compare equal</span>
1726<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">def0</span> <span class="special">==</span> <span class="identifier">def1</span> <span class="special">);</span>
1727
1728<span class="comment">// Only one initialized compare unequal.</span>
1729<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">def0</span> <span class="special">!=</span> <span class="identifier">optX</span> <span class="special">);</span>
1730
1731<span class="comment">// Both initialized compare as (*lhs == *rhs)</span>
1732<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">optX</span> <span class="special">==</span> <span class="identifier">optY</span> <span class="special">)</span> <span class="special">;</span>
1733<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">optX</span> <span class="special">!=</span> <span class="identifier">optZ</span> <span class="special">)</span> <span class="special">;</span>
1734</pre>
1735 </li>
1736</ul></div>
1737<p>
1738 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
1739 </p>
1740<a name="reference_operator_compare_less_optional_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
1741 <code class="computeroutput"><span class="keyword">bool</span> <span class="keyword">operator</span>
1742 <span class="special">&lt;</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">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>
1743 <span class="keyword">const</span><span class="special">&amp;</span>
1744 <span class="identifier">y</span> <span class="special">);</span></code>
1745 </p></blockquote></div>
1746<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1747<li class="listitem">
1748 <span class="bold"><strong>Requires:</strong></span> <code class="computeroutput"><span class="identifier">T</span></code>
1749 shall meet requirements of <code class="computeroutput"><span class="identifier">LessThanComparable</span></code>.
1750 </li>
1751<li class="listitem">
1752 <span class="bold"><strong>Returns:</strong></span> If <code class="computeroutput"><span class="identifier">y</span></code>
1753 is not initialized, <code class="computeroutput"><span class="keyword">false</span></code>.
1754 If <code class="computeroutput"><span class="identifier">y</span></code> is initialized and
1755 <code class="computeroutput"><span class="identifier">x</span></code> is not initialized,
1756 <code class="computeroutput"><span class="keyword">true</span></code>. If both <code class="computeroutput"><span class="identifier">x</span></code> and <code class="computeroutput"><span class="identifier">y</span></code>
1757 are initialized, <code class="computeroutput"><span class="special">(*</span><span class="identifier">x</span>
1758 <span class="special">&lt;</span> <span class="special">*</span><span class="identifier">y</span><span class="special">)</span></code>.
1759 </li>
1760<li class="listitem">
1761 <span class="bold"><strong>Throws:</strong></span> Nothing.
1762 </li>
1763<li class="listitem">
1764 <span class="bold"><strong>Notes:</strong></span> Pointers have shallow relational
1765 operators while <code class="computeroutput"><span class="identifier">optional</span></code>
1766 has deep relational operators. Do not use <code class="computeroutput"><span class="keyword">operator</span>
1767 <span class="special">&lt;</span></code> directly in generic code which
1768 expect to be given either an <code class="computeroutput"><span class="identifier">optional</span><span class="special">&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>
1769 instead.
1770 </li>
1771<li class="listitem">
1772 <span class="bold"><strong>Example:</strong></span>
1773<pre class="programlisting"><span class="identifier">T</span> <span class="identifier">x</span><span class="special">(</span><span class="number">12</span><span class="special">);</span>
1774<span class="identifier">T</span> <span class="identifier">y</span><span class="special">(</span><span class="number">34</span><span class="special">);</span>
1775<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">def</span> <span class="special">;</span>
1776<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>
1777<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>
1778
1779<span class="comment">// Identity always hold</span>
1780<span class="identifier">assert</span> <span class="special">(</span> <span class="special">!(</span><span class="identifier">def</span> <span class="special">&lt;</span> <span class="identifier">def</span><span class="special">)</span> <span class="special">);</span>
1781<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">optX</span> <span class="special">==</span> <span class="identifier">optX</span> <span class="special">);</span>
1782
1783<span class="comment">// Both uninitialized compare equal</span>
1784<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">def0</span> <span class="special">==</span> <span class="identifier">def1</span> <span class="special">);</span>
1785
1786<span class="comment">// Only one initialized compare unequal.</span>
1787<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">def0</span> <span class="special">!=</span> <span class="identifier">optX</span> <span class="special">);</span>
1788
1789<span class="comment">// Both initialized compare as (*lhs == *rhs)</span>
1790<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">optX</span> <span class="special">==</span> <span class="identifier">optY</span> <span class="special">)</span> <span class="special">;</span>
1791<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">optX</span> <span class="special">!=</span> <span class="identifier">optZ</span> <span class="special">)</span> <span class="special">;</span>
1792</pre>
1793 </li>
1794</ul></div>
1795<p>
1796 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
1797 </p>
1798<a name="reference_operator_compare_not_equal_optional_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
1799 <code class="computeroutput"><span class="keyword">bool</span> <span class="keyword">operator</span>
1800 <span class="special">!=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&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>
1801 <span class="keyword">const</span><span class="special">&amp;</span>
1802 <span class="identifier">y</span> <span class="special">);</span></code>
1803 </p></blockquote></div>
1804<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1805<li class="listitem">
1806 <span class="bold"><strong>Returns: </strong></span> <code class="computeroutput"><span class="special">!(</span>
1807 <span class="identifier">x</span> <span class="special">==</span>
1808 <span class="identifier">y</span> <span class="special">);</span></code>
1809 </li>
1810<li class="listitem">
1811 <span class="bold"><strong>Throws:</strong></span> Nothing.
1812 </li>
1813</ul></div>
1814<p>
1815 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
1816 </p>
1817<a name="reference_operator_compare_greater_optional_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
1818 <code class="computeroutput"><span class="keyword">bool</span> <span class="keyword">operator</span>
1819 <span class="special">&gt;</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">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>
1820 <span class="keyword">const</span><span class="special">&amp;</span>
1821 <span class="identifier">y</span> <span class="special">);</span></code>
1822 </p></blockquote></div>
1823<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1824<li class="listitem">
1825 <span class="bold"><strong>Returns: </strong></span> <code class="computeroutput"><span class="special">(</span>
1826 <span class="identifier">y</span> <span class="special">&lt;</span>
1827 <span class="identifier">x</span> <span class="special">);</span></code>
1828 </li>
1829<li class="listitem">
1830 <span class="bold"><strong>Throws:</strong></span> Nothing.
1831 </li>
1832</ul></div>
1833<p>
1834 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
1835 </p>
1836<a name="reference_operator_compare_less_or_equal_optional_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
1837 <code class="computeroutput"><span class="keyword">bool</span> <span class="keyword">operator</span>
1838 <span class="special">&lt;=</span> <span class="special">(</span>
1839 <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>
1840 <span class="keyword">const</span><span class="special">&amp;</span>
1841 <span class="identifier">y</span> <span class="special">);</span></code>
1842 </p></blockquote></div>
1843<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1844<li class="listitem">
1845 <span class="bold"><strong>Returns: </strong></span> <code class="computeroutput"><span class="special">!(</span>
1846 <span class="identifier">y</span> <span class="special">&lt;</span>
1847 <span class="identifier">x</span> <span class="special">);</span></code>
1848 </li>
1849<li class="listitem">
1850 <span class="bold"><strong>Throws:</strong></span> Nothing.
1851 </li>
1852</ul></div>
1853<p>
1854 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
1855 </p>
1856<a name="reference_operator_compare_greater_or_equal_optional_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
1857 <code class="computeroutput"><span class="keyword">bool</span> <span class="keyword">operator</span>
1858 <span class="special">&gt;=</span> <span class="special">(</span>
1859 <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>
1860 <span class="keyword">const</span><span class="special">&amp;</span>
1861 <span class="identifier">y</span> <span class="special">);</span></code>
1862 </p></blockquote></div>
1863<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1864<li class="listitem">
1865 <span class="bold"><strong>Returns: </strong></span> <code class="computeroutput"><span class="special">!(</span>
1866 <span class="identifier">x</span><span class="special">&lt;</span><span class="identifier">y</span> <span class="special">);</span></code>
1867 </li>
1868<li class="listitem">
1869 <span class="bold"><strong>Throws:</strong></span> Nothing.
1870 </li>
1871</ul></div>
1872<a name="reference_operator_compare_equal_optional_none"></a><div class="blockquote"><blockquote class="blockquote"><p>
1873 <code class="computeroutput"><span class="keyword">bool</span> <span class="keyword">operator</span>
1874 <span class="special">==</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&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>
1875 <span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span></code>
1876 </p></blockquote></div>
1877<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1878<li class="listitem">
1879 <span class="bold"><strong>Returns:</strong></span> <code class="computeroutput"><span class="special">!</span><span class="identifier">x</span></code>.
1880 </li>
1881<li class="listitem">
1882 <span class="bold"><strong>Notes:</strong></span> <code class="computeroutput"><span class="identifier">T</span></code>
1883 need not meet requirements of <code class="computeroutput"><span class="identifier">EqualityComparable</span></code>.
1884 </li>
1885</ul></div>
1886<p>
1887 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
1888 </p>
1889<a name="reference_operator_compare_not_equal_optional_none"></a><div class="blockquote"><blockquote class="blockquote"><p>
1890 <code class="computeroutput"><span class="keyword">bool</span> <span class="keyword">operator</span>
1891 <span class="special">!=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&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>
1892 <span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span></code>
1893 </p></blockquote></div>
1894<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
1895 <span class="bold"><strong>Returns: </strong></span> <code class="computeroutput"><span class="special">!(</span>
1896 <span class="identifier">x</span> <span class="special">==</span>
1897 <span class="identifier">y</span> <span class="special">);</span></code>
1898 </li></ul></div>
1899<p>
1900 <span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
1901 </p>
1902<a name="reference_swap_optional_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
1903 <code class="computeroutput"><span class="keyword">void</span> <span class="identifier">swap</span>
1904 <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&amp;</span>
1905 <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> <span class="special">)</span> <span class="special">;</span></code>
1906 </p></blockquote></div>
1907<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1908<li class="listitem">
1909 <span class="bold"><strong>Effect:</strong></span> If both <code class="computeroutput"><span class="identifier">x</span></code>
1910 and <code class="computeroutput"><span class="identifier">y</span></code> are initialized,
1911 calls <code class="computeroutput"><span class="identifier">swap</span><span class="special">(*</span><span class="identifier">x</span><span class="special">,*</span><span class="identifier">y</span><span class="special">)</span></code> using <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">swap</span></code>.
1912 If only one is initialized, say <code class="computeroutput"><span class="identifier">x</span></code>,
1913 calls: <code class="computeroutput"><span class="identifier">y</span><span class="special">.</span><span class="identifier">reset</span><span class="special">(*</span><span class="identifier">x</span><span class="special">);</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">reset</span><span class="special">();</span></code> If none is initialized, does nothing.
1914 </li>
1915<li class="listitem">
1916 <span class="bold"><strong>Postconditions:</strong></span> The states of <code class="computeroutput"><span class="identifier">x</span></code> and <code class="computeroutput"><span class="identifier">y</span></code>
1917 interchanged.
1918 </li>
1919<li class="listitem">
1920 <span class="bold"><strong>Throws:</strong></span> If both are initialized, whatever
1921 <code class="computeroutput"><span class="identifier">swap</span><span class="special">(</span><span class="identifier">T</span><span class="special">&amp;,</span><span class="identifier">T</span><span class="special">&amp;)</span></code>
1922 throws. If only one is initialized, whatever <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span> <span class="special">(</span> <span class="identifier">T</span><span class="special">&amp;&amp;</span>
1923 <span class="special">)</span></code> throws.
1924 </li>
1925<li class="listitem">
1926 <span class="bold"><strong>Notes:</strong></span> If both are initialized, <code class="computeroutput"><span class="identifier">swap</span><span class="special">(</span><span class="identifier">T</span><span class="special">&amp;,</span><span class="identifier">T</span><span class="special">&amp;)</span></code>
1927 is used unqualified but with <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">swap</span></code>
1928 introduced in scope. If only one is initialized, <code class="computeroutput"><span class="identifier">T</span><span class="special">::~</span><span class="identifier">T</span><span class="special">()</span></code> and <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span>
1929 <span class="identifier">T</span><span class="special">&amp;&amp;</span>
1930 <span class="special">)</span></code> is called.
1931 </li>
1932<li class="listitem">
1933 <span class="bold"><strong>Exception Safety:</strong></span> If both are initialized,
1934 this operation has the exception safety guarantees of <code class="computeroutput"><span class="identifier">swap</span><span class="special">(</span><span class="identifier">T</span><span class="special">&amp;,</span><span class="identifier">T</span><span class="special">&amp;)</span></code>.
1935 If only one is initialized, it has the same basic guarantee as <code class="computeroutput"><span class="identifier">optional</span><span class="special">&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">T</span><span class="special">&amp;&amp;</span>
1936 <span class="special">)</span></code>.
1937 </li>
1938<li class="listitem">
1939 <span class="bold"><strong>Example:</strong></span>
1940<pre class="programlisting"><span class="identifier">T</span> <span class="identifier">x</span><span class="special">(</span><span class="number">12</span><span class="special">);</span>
1941<span class="identifier">T</span> <span class="identifier">y</span><span class="special">(</span><span class="number">21</span><span class="special">);</span>
1942<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">def0</span> <span class="special">;</span>
1943<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>
1944<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>
1945<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>
1946
1947<span class="identifier">boost</span><span class="special">::</span><span class="identifier">swap</span><span class="special">(</span><span class="identifier">def0</span><span class="special">,</span><span class="identifier">def1</span><span class="special">);</span> <span class="comment">// no-op</span>
1948
1949<span class="identifier">boost</span><span class="special">::</span><span class="identifier">swap</span><span class="special">(</span><span class="identifier">def0</span><span class="special">,</span><span class="identifier">optX</span><span class="special">);</span>
1950<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">def0</span> <span class="special">==</span> <span class="identifier">x</span> <span class="special">);</span>
1951<span class="identifier">assert</span> <span class="special">(</span> <span class="special">!</span><span class="identifier">optX</span> <span class="special">);</span>
1952
1953<span class="identifier">boost</span><span class="special">::</span><span class="identifier">swap</span><span class="special">(</span><span class="identifier">def0</span><span class="special">,</span><span class="identifier">optX</span><span class="special">);</span> <span class="comment">// Get back to original values</span>
1954
1955<span class="identifier">boost</span><span class="special">::</span><span class="identifier">swap</span><span class="special">(</span><span class="identifier">optX</span><span class="special">,</span><span class="identifier">optY</span><span class="special">);</span>
1956<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">optX</span> <span class="special">==</span> <span class="identifier">y</span> <span class="special">);</span>
1957<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">optY</span> <span class="special">==</span> <span class="identifier">x</span> <span class="special">);</span>
1958</pre>
1959 </li>
1960</ul></div>
1961</div>
1962<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
1963<td align="left"></td>
1964<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014 Andrzej Krzemie&#324;ski<p>
1965 Distributed under the Boost Software License, Version 1.0. (See accompanying
1966 file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
1967 </p>
1968</div></td>
1969</tr></table>
1970<hr>
1971<div class="spirit-nav">
1972<a accesskey="p" href="synopsis.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="dependencies_and_portability.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
1973</div>
1974</body>
1975</html>