]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/optional/doc/html/boost_optional/detailed_semantics.html
bump version to 12.2.2-pve1
[ceph.git] / ceph / src / boost / libs / optional / doc / html / boost_optional / detailed_semantics.html
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>