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