• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<html>
2<head>
3<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
4<title>Detailed Semantics</title>
5<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css">
6<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
7<link rel="home" href="../index.html" title="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>
1976