]> 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><span class="special">&gt;::</span><span class="identifier">optional</span><span class="special">(</span>
101 <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>
102 </p></blockquote></div>
103<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
104<li class="listitem">
105 <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>
106 is <code class="computeroutput"><span class="keyword">true</span></code>.
107 </li>
108<li class="listitem">
109 <span class="bold"><strong>Effect:</strong></span> Directly-Constructs an <code class="computeroutput"><span class="identifier">optional</span></code>.
110 </li>
111<li class="listitem">
112 <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>
113 and its value is a <span class="emphasis"><em>copy</em></span> of <code class="computeroutput"><span class="identifier">v</span></code>.
114 </li>
115<li class="listitem">
116 <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>
117 <span class="special">)</span></code> throws.
118 </li>
119<li class="listitem">
120 <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>
121 <span class="special">)</span></code> is called.
122 </li>
123<li class="listitem">
124 <span class="bold"><strong>Exception Safety:</strong></span> Exceptions can only
125 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>
126 <span class="special">);</span></code> in that case, this constructor
127 has no effect.
128 </li>
129<li class="listitem">
130 <span class="bold"><strong>Example:</strong></span>
131<pre class="programlisting"><span class="identifier">T</span> <span class="identifier">v</span><span class="special">;</span>
132<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>
133<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>
134</pre>
135 </li>
136</ul></div>
137<p>
138 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
139 </p>
140<a name="reference_optional_constructor_move_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
141 <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>
142 <span class="identifier">T</span><span class="special">&amp;&amp;</span>
143 <span class="identifier">v</span> <span class="special">)</span></code>
144 </p></blockquote></div>
145<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
146<li class="listitem">
147 <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>
148 is <code class="computeroutput"><span class="keyword">true</span></code>.
149 </li>
150<li class="listitem">
151 <span class="bold"><strong>Effect:</strong></span> Directly-Move-Constructs an
152 <code class="computeroutput"><span class="identifier">optional</span></code>.
153 </li>
154<li class="listitem">
155 <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>
156 and its value is move-constructed from <code class="computeroutput"><span class="identifier">v</span></code>.
157 </li>
158<li class="listitem">
159 <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>
160 throws.
161 </li>
162<li class="listitem">
163 <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>
164 is called.
165 </li>
166<li class="listitem">
167 <span class="bold"><strong>Exception Safety:</strong></span> Exceptions can only
168 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>
169 in that case, the state of <code class="computeroutput"><span class="identifier">v</span></code>
170 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>.
171 </li>
172<li class="listitem">
173 <span class="bold"><strong>Example:</strong></span>
174<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>
175<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>
176<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>
177</pre>
178 </li>
179</ul></div>
180<p>
181 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
182 </p>
183<a name="reference_optional_constructor_bool_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
184 <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>
185 <span class="keyword">bool</span> <span class="identifier">condition</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span></code>
186 </p></blockquote></div>
187<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
188 If condition is true, same as:
189 </li></ul></div>
190<div class="blockquote"><blockquote class="blockquote"><p>
191 <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>
192 <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>
193 </p></blockquote></div>
194<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
195 otherwise, same as:
196 </li></ul></div>
197<div class="blockquote"><blockquote class="blockquote"><p>
198 <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></code>
199 </p></blockquote></div>
200<p>
201 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
202 </p>
203<a name="reference_optional_constructor_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
204 <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>
205 <span class="identifier">optional</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rhs</span>
206 <span class="special">);</span></code>
207 </p></blockquote></div>
208<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
209<li class="listitem">
210 <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>
211 is <code class="computeroutput"><span class="keyword">true</span></code>.
212 </li>
213<li class="listitem">
214 <span class="bold"><strong>Effect:</strong></span> Copy-Constructs an <code class="computeroutput"><span class="identifier">optional</span></code>.
215 </li>
216<li class="listitem">
217 <span class="bold"><strong>Postconditions:</strong></span> If rhs is initialized,
218 <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
219 is initialized and its value is a <span class="emphasis"><em>copy</em></span> of the
220 value of <code class="computeroutput"><span class="identifier">rhs</span></code>; else
221 <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
222 is uninitialized.
223 </li>
224<li class="listitem">
225 <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>
226 <span class="special">)</span></code> throws.
227 </li>
228<li class="listitem">
229 <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>
230 is called.
231 </li>
232<li class="listitem">
233 <span class="bold"><strong>Exception Safety:</strong></span> Exceptions can only
234 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>
235 <span class="special">);</span></code> in that case, this constructor
236 has no effect.
237 </li>
238<li class="listitem">
239 <span class="bold"><strong>Example:</strong></span>
240<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>
241<span class="identifier">assert</span> <span class="special">(!</span><span class="identifier">uninit</span><span class="special">);</span>
242
243<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>
244<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>
245
246<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>
247<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>
248
249<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>
250<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>
251</pre>
252 </li>
253</ul></div>
254<p>
255 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
256 </p>
257<a name="reference_optional_move_constructor_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
258 <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>
259 <span class="identifier">optional</span><span class="special">&amp;&amp;</span>
260 <span class="identifier">rhs</span> <span class="special">)</span>
261 <span class="keyword">noexcept</span><span class="special">(</span></code><span class="emphasis"><em>see
262 below</em></span><code class="computeroutput"><span class="special">);</span></code>
263 </p></blockquote></div>
264<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
265<li class="listitem">
266 <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>
267 is <code class="computeroutput"><span class="keyword">true</span></code>.
268 </li>
269<li class="listitem">
270 <span class="bold"><strong>Effect:</strong></span> Move-constructs an <code class="computeroutput"><span class="identifier">optional</span></code>.
271 </li>
272<li class="listitem">
273 <span class="bold"><strong>Postconditions:</strong></span> If <code class="computeroutput"><span class="identifier">rhs</span></code>
274 is initialized, <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
275 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.
276 </li>
277<li class="listitem">
278 <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>
279 throws.
280 </li>
281<li class="listitem">
282 <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>.
283 </li>
284<li class="listitem">
285 <span class="bold"><strong>Notes:</strong></span> If <code class="computeroutput"><span class="identifier">rhs</span></code>
286 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>
287 <span class="special">)</span></code> is called.
288 </li>
289<li class="listitem">
290 <span class="bold"><strong>Exception Safety:</strong></span> Exceptions can only
291 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>
292 in that case, <code class="computeroutput"><span class="identifier">rhs</span></code> remains
293 initialized and the value of <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code> is determined by exception safety
294 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>.
295 </li>
296<li class="listitem">
297 <span class="bold"><strong>Example:</strong></span>
298<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>
299<span class="identifier">assert</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">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>
302<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>
303
304<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>
305<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>
306
307<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>
308<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">init</span> <span class="special">);</span>
309<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>
310<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">init2</span> <span class="special">);</span>
311<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>
312</pre>
313 </li>
314</ul></div>
315<p>
316 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
317 </p>
318<a name="reference_optional_constructor_other_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
319 <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><span class="special">&gt;::</span><span class="identifier">optional</span><span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rhs</span>
320 <span class="special">);</span></code>
321 </p></blockquote></div>
322<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
323<li class="listitem">
324 <span class="bold"><strong>Effect:</strong></span> Copy-Constructs an <code class="computeroutput"><span class="identifier">optional</span></code>.
325 </li>
326<li class="listitem">
327 <span class="bold"><strong>Postconditions:</strong></span> If <code class="computeroutput"><span class="identifier">rhs</span></code>
328 is initialized, <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
329 is initialized and its value is a <span class="emphasis"><em>copy</em></span> of the
330 value of rhs converted to type <code class="computeroutput"><span class="identifier">T</span></code>;
331 else <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
332 is uninitialized.
333 </li>
334<li class="listitem">
335 <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>
336 <span class="special">)</span></code> throws.
337 </li>
338<li class="listitem">
339 <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>
340 <span class="special">)</span></code> is called if <code class="computeroutput"><span class="identifier">rhs</span></code> is initialized, which requires
341 a valid conversion from <code class="computeroutput"><span class="identifier">U</span></code>
342 to <code class="computeroutput"><span class="identifier">T</span></code>.
343 </li>
344<li class="listitem">
345 <span class="bold"><strong>Exception Safety:</strong></span> Exceptions can only
346 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>
347 <span class="special">);</span></code> in that case, this constructor
348 has no effect.
349 </li>
350<li class="listitem">
351 <span class="bold"><strong>Example:</strong></span>
352<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>
353<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>
354
355<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>
356<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>
357</pre>
358 </li>
359</ul></div>
360<p>
361 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
362 </p>
363<a name="reference_optional_move_constructor_other_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
364 <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><span class="special">&gt;::</span><span class="identifier">optional</span><span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">rhs</span>
365 <span class="special">);</span></code>
366 </p></blockquote></div>
367<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
368<li class="listitem">
369 <span class="bold"><strong>Effect:</strong></span> Move-constructs an <code class="computeroutput"><span class="identifier">optional</span></code>.
370 </li>
371<li class="listitem">
372 <span class="bold"><strong>Postconditions:</strong></span> If <code class="computeroutput"><span class="identifier">rhs</span></code>
373 is initialized, <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
374 is initialized and its value is move-constructed from <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code>;
375 else <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
376 is uninitialized.
377 </li>
378<li class="listitem">
379 <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>
380 throws.
381 </li>
382<li class="listitem">
383 <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>
384 is called if <code class="computeroutput"><span class="identifier">rhs</span></code> is
385 initialized, which requires a valid conversion from <code class="computeroutput"><span class="identifier">U</span></code>
386 to <code class="computeroutput"><span class="identifier">T</span></code>.
387 </li>
388<li class="listitem">
389 <span class="bold"><strong>Exception Safety:</strong></span> Exceptions can only
390 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>
391 in that case, <code class="computeroutput"><span class="identifier">rhs</span></code> remains
392 initialized and the value of <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code> is determined by exception safety
393 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>
394 <span class="special">)</span></code>.
395 </li>
396<li class="listitem">
397 <span class="bold"><strong>Example:</strong></span>
398<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>
399<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>
400
401<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>
402<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>
403</pre>
404 </li>
405</ul></div>
406<p>
407 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
408 </p>
409<a name="reference_optional_in_place_init"></a><div class="blockquote"><blockquote class="blockquote"><p>
410 <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>
411 <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="identifier">optional</span><span class="special">(</span> <span class="identifier">in_place_init_t</span><span class="special">,</span> <span class="identifier">Args</span><span class="special">&amp;&amp;...</span> <span class="identifier">ars</span>
412 <span class="special">);</span></code>
413 </p></blockquote></div>
414<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
415<li class="listitem">
416 <span class="bold"><strong>Requires:</strong></span> <code class="computeroutput"><span class="identifier">is_constructible_v</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Args</span><span class="special">&amp;&amp;...&gt;</span></code> is <code class="computeroutput"><span class="keyword">true</span></code>.
417 </li>
418<li class="listitem">
419 <span class="bold"><strong>Effect:</strong></span> Initializes the contained
420 value as if direct-non-list-initializing an object of type <code class="computeroutput"><span class="identifier">T</span></code> with the arguments <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>.
421 </li>
422<li class="listitem">
423 <span class="bold"><strong>Postconditions:</strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is initialized.
424 </li>
425<li class="listitem">
426 <span class="bold"><strong>Throws:</strong></span> Any exception thrown by the
427 selected constructor of <code class="computeroutput"><span class="identifier">T</span></code>.
428 </li>
429<li class="listitem">
430 <span class="bold"><strong>Notes: </strong></span> <code class="computeroutput"><span class="identifier">T</span></code>
431 need not be <code class="computeroutput"><span class="identifier">MoveConstructible</span></code>.
432 On compilers that do not suppor variadic templates or rvalue references,
433 this constuctor is available in limited functionality. For details
434 <a class="link" href="../../dependencies_and_portability/emplace_operations_in_older_compilers.html#optional_emplace_workaround">see here</a>.
435 </li>
436<li class="listitem">
437 <span class="bold"><strong>Example:</strong></span>
438<pre class="programlisting"><span class="comment">// creates an std::mutex using its default constructor</span>
439<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;</span> <span class="identifier">om</span> <span class="special">{</span><span class="identifier">in_place_init</span><span class="special">};</span>
440<span class="identifier">assert</span> <span class="special">(</span><span class="identifier">om</span><span class="special">);</span>
441
442<span class="comment">// creates a unique_lock by calling unique_lock(*om, std::defer_lock)</span>
443<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;&gt;</span> <span class="identifier">ol</span> <span class="special">{</span><span class="identifier">in_place_init</span><span class="special">,</span> <span class="special">*</span><span class="identifier">om</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">defer_lock</span><span class="special">};</span>
444<span class="identifier">assert</span> <span class="special">(</span><span class="identifier">ol</span><span class="special">);</span>
445<span class="identifier">assert</span> <span class="special">(!</span><span class="identifier">ol</span><span class="special">-&gt;</span><span class="identifier">owns_lock</span><span class="special">());</span>
446</pre>
447 </li>
448</ul></div>
449<p>
450 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
451 </p>
452<a name="reference_optional_in_place_init_if"></a><div class="blockquote"><blockquote class="blockquote"><p>
453 <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>
454 <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="identifier">optional</span><span class="special">(</span> <span class="identifier">in_place_init_if_t</span><span class="special">,</span> <span class="keyword">bool</span> <span class="identifier">condition</span><span class="special">,</span>
455 <span class="identifier">Args</span><span class="special">&amp;&amp;...</span>
456 <span class="identifier">ars</span> <span class="special">);</span></code>
457 </p></blockquote></div>
458<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
459<li class="listitem">
460 <span class="bold"><strong>Requires:</strong></span> <code class="computeroutput"><span class="identifier">is_constructible_v</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Args</span><span class="special">&amp;&amp;...&gt;</span></code> is <code class="computeroutput"><span class="keyword">true</span></code>.
461 </li>
462<li class="listitem">
463 <span class="bold"><strong>Effect:</strong></span> If <code class="computeroutput"><span class="identifier">condition</span></code>
464 is <code class="computeroutput"><span class="keyword">true</span></code>, initializes the
465 contained value as if direct-non-list-initializing an object of type
466 <code class="computeroutput"><span class="identifier">T</span></code> with the arguments
467 <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>.
468 </li>
469<li class="listitem">
470 <span class="bold"><strong>Postconditions:</strong></span> <code class="computeroutput"><span class="keyword">bool</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">condition</span></code>.
471 </li>
472<li class="listitem">
473 <span class="bold"><strong>Throws:</strong></span> Any exception thrown by the
474 selected constructor of <code class="computeroutput"><span class="identifier">T</span></code>.
475 </li>
476<li class="listitem">
477 <span class="bold"><strong>Notes: </strong></span> <code class="computeroutput"><span class="identifier">T</span></code>
478 need not be <code class="computeroutput"><span class="identifier">MoveConstructible</span></code>.
479 On compilers that do not suppor variadic templates or rvalue references,
480 this constuctor is available in limited functionality. For details
481 <a class="link" href="../../dependencies_and_portability/emplace_operations_in_older_compilers.html#optional_emplace_workaround">see here</a>.
482 </li>
483<li class="listitem">
484 <span class="bold"><strong>Example:</strong></span>
485<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">vector</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&gt;&gt;</span> <span class="identifier">ov1</span> <span class="special">{</span><span class="identifier">in_place_init_if</span><span class="special">,</span> <span class="keyword">false</span><span class="special">,</span> <span class="number">3</span><span class="special">,</span> <span class="string">"A"</span><span class="special">};</span>
486<span class="identifier">assert</span> <span class="special">(!</span><span class="identifier">ov1</span><span class="special">);</span>
487
488<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&gt;&gt;</span> <span class="identifier">ov2</span> <span class="special">{</span><span class="identifier">in_place_init_if</span><span class="special">,</span> <span class="keyword">true</span><span class="special">,</span> <span class="number">3</span><span class="special">,</span> <span class="string">"A"</span><span class="special">};</span>
489<span class="identifier">assert</span> <span class="special">(</span><span class="identifier">ov2</span><span class="special">);</span>
490<span class="identifier">assert</span> <span class="special">(</span><span class="identifier">ov2</span><span class="special">-&gt;</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="number">3</span><span class="special">);</span>
491</pre>
492 </li>
493</ul></div>
494<p>
495 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
496 </p>
497<a name="reference_optional_constructor_factory"></a><div class="blockquote"><blockquote class="blockquote"><p>
498 <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="identifier">InPlaceFactory</span><span class="special">&gt;</span>
499 <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="identifier">optional</span><span class="special">(</span> <span class="identifier">InPlaceFactory</span>
500 <span class="keyword">const</span><span class="special">&amp;</span>
501 <span class="identifier">f</span> <span class="special">);</span></code>
502 </p></blockquote></div>
503<div class="blockquote"><blockquote class="blockquote"><p>
504 <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="identifier">TypedInPlaceFactory</span><span class="special">&gt;</span>
505 <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="identifier">optional</span><span class="special">(</span> <span class="identifier">TypedInPlaceFactory</span>
506 <span class="keyword">const</span><span class="special">&amp;</span>
507 <span class="identifier">f</span> <span class="special">);</span></code>
508 </p></blockquote></div>
509<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
510<li class="listitem">
511 <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.
512 </li>
513<li class="listitem">
514 <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>
515 and its value is <span class="emphasis"><em>directly given</em></span> from the factory
516 <code class="computeroutput"><span class="identifier">f</span></code> (i.e., the value
517 <span class="underline">is not copied</span>).
518 </li>
519<li class="listitem">
520 <span class="bold"><strong>Throws:</strong></span> Whatever the <code class="computeroutput"><span class="identifier">T</span></code> constructor called by the factory
521 throws.
522 </li>
523<li class="listitem">
524 <span class="bold"><strong>Notes:</strong></span> See <a class="link" href="../../tutorial/in_place_factories.html" title="In-Place Factories">In-Place
525 Factories</a>
526 </li>
527<li class="listitem">
528 <span class="bold"><strong>Exception Safety:</strong></span> Exceptions can only
529 be thrown during the call to the <code class="computeroutput"><span class="identifier">T</span></code>
530 constructor used by the factory; in that case, this constructor has
531 no effect.
532 </li>
533<li class="listitem">
534 <span class="bold"><strong>Example:</strong></span>
535<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>
536
537<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>
538
539<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>
540<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>
541
542<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>
543<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>
544</pre>
545 </li>
546</ul></div>
547<p>
548 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
549 </p>
550<a name="reference_optional_operator_equal_none_t"></a><div class="blockquote"><blockquote class="blockquote"><p>
551 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&amp;</span>
552 <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>
553 <span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span></code>
554 </p></blockquote></div>
555<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
556<li class="listitem">
557 <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
558 value.
559 </li>
560<li class="listitem">
561 <span class="bold"><strong>Postconditions: </strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is uninitialized.
562 </li>
563</ul></div>
564<p>
565 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
566 </p>
567<a name="reference_optional_operator_equal_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
568 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&amp;</span>
569 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rhs</span> <span class="special">)</span> <span class="special">;</span></code>
570 </p></blockquote></div>
571<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
572<li class="listitem">
573 <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>.
574 </li>
575<li class="listitem">
576 <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
577 a <span class="emphasis"><em>copy</em></span> of <code class="computeroutput"><span class="identifier">rhs</span></code>.
578 </li>
579<li class="listitem">
580 <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>
581 <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>
582 throws.
583 </li>
584<li class="listitem">
585 <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,
586 otherwise, its copy-constructor is used.
587 </li>
588<li class="listitem">
589 <span class="bold"><strong>Exception Safety:</strong></span> In the event of
590 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
591 as far as <code class="computeroutput"><span class="identifier">optional</span></code>
592 is concerned (it is up to <code class="computeroutput"><span class="identifier">T</span></code>'s
593 <code class="computeroutput"><span class="keyword">operator</span><span class="special">=()</span></code>).
594 If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
595 is initially uninitialized and <code class="computeroutput"><span class="identifier">T</span></code>'s
596 <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.
597 </li>
598<li class="listitem">
599 <span class="bold"><strong>Example:</strong></span>
600<pre class="programlisting"><span class="identifier">T</span> <span class="identifier">x</span><span class="special">;</span>
601<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>
602<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>
603
604<span class="identifier">T</span> <span class="identifier">y</span><span class="special">;</span>
605<span class="identifier">def</span> <span class="special">=</span> <span class="identifier">y</span> <span class="special">;</span>
606<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>
607<span class="identifier">opt</span> <span class="special">=</span> <span class="identifier">y</span> <span class="special">;</span>
608<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>
609</pre>
610 </li>
611</ul></div>
612<p>
613 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
614 </p>
615<a name="reference_optional_operator_move_equal_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
616 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&amp;</span>
617 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">T</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span>
618 <span class="special">)</span> <span class="special">;</span></code>
619 </p></blockquote></div>
620<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
621<li class="listitem">
622 <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>.
623 </li>
624<li class="listitem">
625 <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
626 moved from <code class="computeroutput"><span class="identifier">rhs</span></code>.
627 </li>
628<li class="listitem">
629 <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>
630 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>
631 throws.
632 </li>
633<li class="listitem">
634 <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,
635 otherwise, its move-constructor is used.
636 </li>
637<li class="listitem">
638 <span class="bold"><strong>Exception Safety:</strong></span> In the event of
639 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
640 as far as <code class="computeroutput"><span class="identifier">optional</span></code>
641 is concerned (it is up to <code class="computeroutput"><span class="identifier">T</span></code>'s
642 <code class="computeroutput"><span class="keyword">operator</span><span class="special">=()</span></code>).
643 If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
644 is initially uninitialized and <code class="computeroutput"><span class="identifier">T</span></code>'s
645 <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.
646 </li>
647<li class="listitem">
648 <span class="bold"><strong>Example:</strong></span>
649<pre class="programlisting"><span class="identifier">T</span> <span class="identifier">x</span><span class="special">;</span>
650<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>
651<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>
652
653<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>
654<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>
655<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>
656<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>
657<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>
658</pre>
659 </li>
660</ul></div>
661<p>
662 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
663 </p>
664<a name="reference_optional_operator_equal_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
665 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&amp;</span>
666 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">optional</span>
667 <span class="keyword">const</span><span class="special">&amp;</span>
668 <span class="identifier">rhs</span> <span class="special">)</span>
669 <span class="special">;</span></code>
670 </p></blockquote></div>
671<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
672<li class="listitem">
673 <span class="bold"><strong>Requires:</strong></span> <code class="computeroutput"><span class="identifier">T</span></code>
674 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>.
675 </li>
676<li class="listitem">
677<p class="simpara">
678 <span class="bold"><strong>Effects:</strong></span>
679 </p>
680<div class="informaltable"><table class="table">
681<colgroup>
682<col>
683<col>
684<col>
685</colgroup>
686<thead><tr></tr></thead>
687<tbody>
688<tr>
689<td>
690 </td>
691<td>
692 <p>
693 <span class="bold"><strong><code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> contains a value</strong></span>
694 </p>
695 </td>
696<td>
697 <p>
698 <span class="bold"><strong><code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> does not contain a value</strong></span>
699 </p>
700 </td>
701</tr>
702<tr>
703<td>
704 <p>
705 <span class="bold"><strong><code class="computeroutput"><span class="identifier">rhs</span></code>
706 contains a value</strong></span>
707 </p>
708 </td>
709<td>
710 <p>
711 assigns <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code>
712 to the contained value
713 </p>
714 </td>
715<td>
716 <p>
717 initializes the contained value as if direct-initializing
718 an object of type <code class="computeroutput"><span class="identifier">T</span></code>
719 with <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code>
720 </p>
721 </td>
722</tr>
723<tr>
724<td>
725 <p>
726 <span class="bold"><strong><code class="computeroutput"><span class="identifier">rhs</span></code>
727 does not contain a value</strong></span>
728 </p>
729 </td>
730<td>
731 <p>
732 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>
733 </p>
734 </td>
735<td>
736 <p>
737 no effect
738 </p>
739 </td>
740</tr>
741</tbody>
742</table></div>
743</li>
744<li class="listitem">
745 <span class="bold"><strong>Returns:</strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>;
746 </li>
747<li class="listitem">
748 <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>.
749 </li>
750<li class="listitem">
751 <span class="bold"><strong>Exception Safety:</strong></span> If any exception
752 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>
753 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.
754 If an exception is thrown during the call to <code class="computeroutput"><span class="identifier">T</span></code>'s
755 copy assignment, the state of its contained value is as defined by
756 the exception safety guarantee of <code class="computeroutput"><span class="identifier">T</span></code>'s
757 copy assignment.
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">v</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">opt</span><span class="special">(</span><span class="identifier">v</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">def</span> <span class="special">;</span>
764
765<span class="identifier">opt</span> <span class="special">=</span> <span class="identifier">def</span> <span class="special">;</span>
766<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>
767<span class="comment">// previous value (copy of 'v') destroyed from within 'opt'.</span>
768</pre>
769 </li>
770</ul></div>
771<p>
772 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
773 </p>
774<a name="reference_optional_operator_move_equal_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
775 <code class="computeroutput"><span class="identifier">optional</span><span class="special">&amp;</span>
776 <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">optional</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span>
777 <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>
778 </p></blockquote></div>
779<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
780<li class="listitem">
781 <span class="bold"><strong>Requires:</strong></span> <code class="computeroutput"><span class="identifier">T</span></code>
782 is <code class="computeroutput"><span class="identifier">MoveConstructible</span></code>
783 and <code class="computeroutput"><span class="identifier">MoveAssignable</span></code>.
784 </li>
785<li class="listitem">
786<p class="simpara">
787 <span class="bold"><strong>Effects:</strong></span>
788 </p>
789<div class="informaltable"><table class="table">
790<colgroup>
791<col>
792<col>
793<col>
794</colgroup>
795<thead><tr></tr></thead>
796<tbody>
797<tr>
798<td>
799 </td>
800<td>
801 <p>
802 <span class="bold"><strong><code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> contains a value</strong></span>
803 </p>
804 </td>
805<td>
806 <p>
807 <span class="bold"><strong><code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> does not contain a value</strong></span>
808 </p>
809 </td>
810</tr>
811<tr>
812<td>
813 <p>
814 <span class="bold"><strong><code class="computeroutput"><span class="identifier">rhs</span></code>
815 contains a value</strong></span>
816 </p>
817 </td>
818<td>
819 <p>
820 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
821 </p>
822 </td>
823<td>
824 <p>
825 initializes the contained value as if direct-initializing
826 an object of type <code class="computeroutput"><span class="identifier">T</span></code>
827 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>
828 </p>
829 </td>
830</tr>
831<tr>
832<td>
833 <p>
834 <span class="bold"><strong><code class="computeroutput"><span class="identifier">rhs</span></code>
835 does not contain a value</strong></span>
836 </p>
837 </td>
838<td>
839 <p>
840 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>
841 </p>
842 </td>
843<td>
844 <p>
845 no effect
846 </p>
847 </td>
848</tr>
849</tbody>
850</table></div>
851</li>
852<li class="listitem">
853 <span class="bold"><strong>Returns:</strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>;
854 </li>
855<li class="listitem">
856 <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>.
857 </li>
858<li class="listitem">
859 <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>
860 <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>.
861 </li>
862<li class="listitem">
863 <span class="bold"><strong>Exception Safety:</strong></span> If any exception
864 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>
865 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
866 <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code>
867 is determined by the exception safety guarantee of <code class="computeroutput"><span class="identifier">T</span></code>'s
868 move constructor. If an exception is thrown during the call to T's
869 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
870 safety guarantee of T's move assignment.
871 </li>
872<li class="listitem">
873 <span class="bold"><strong>Example:</strong></span>
874<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>
875<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>
876
877<span class="identifier">opt</span> <span class="special">=</span> <span class="identifier">def</span> <span class="special">;</span>
878<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">def</span> <span class="special">)</span> <span class="special">;</span>
879<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">opt</span> <span class="special">)</span> <span class="special">;</span>
880<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>
881</pre>
882 </li>
883</ul></div>
884<p>
885 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
886 </p>
887<a name="reference_optional_operator_equal_other_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
888 <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>
889 <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">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>
890 <span class="special">)</span> <span class="special">;</span></code>
891 </p></blockquote></div>
892<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
893<li class="listitem">
894<p class="simpara">
895 <span class="bold"><strong>Effect:</strong></span>
896 </p>
897<div class="informaltable"><table class="table">
898<colgroup>
899<col>
900<col>
901<col>
902</colgroup>
903<thead><tr></tr></thead>
904<tbody>
905<tr>
906<td>
907 </td>
908<td>
909 <p>
910 <span class="bold"><strong><code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> contains a value</strong></span>
911 </p>
912 </td>
913<td>
914 <p>
915 <span class="bold"><strong><code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> does not contain a value</strong></span>
916 </p>
917 </td>
918</tr>
919<tr>
920<td>
921 <p>
922 <span class="bold"><strong><code class="computeroutput"><span class="identifier">rhs</span></code>
923 contains a value</strong></span>
924 </p>
925 </td>
926<td>
927 <p>
928 assigns <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code>
929 to the contained value
930 </p>
931 </td>
932<td>
933 <p>
934 initializes the contained value as if direct-initializing
935 an object of type <code class="computeroutput"><span class="identifier">T</span></code>
936 with <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code>
937 </p>
938 </td>
939</tr>
940<tr>
941<td>
942 <p>
943 <span class="bold"><strong><code class="computeroutput"><span class="identifier">rhs</span></code>
944 does not contain a value</strong></span>
945 </p>
946 </td>
947<td>
948 <p>
949 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>
950 </p>
951 </td>
952<td>
953 <p>
954 no effect
955 </p>
956 </td>
957</tr>
958</tbody>
959</table></div>
960</li>
961<li class="listitem">
962 <span class="bold"><strong>Returns:</strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
963 </li>
964<li class="listitem">
965 <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>.
966 </li>
967<li class="listitem">
968 <span class="bold"><strong>Exception Safety:</strong></span> If any exception
969 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
970 is thrown during the call to <code class="computeroutput"><span class="identifier">T</span></code>'s
971 constructor, no effect. If an exception is thrown during the call to
972 <code class="computeroutput"><span class="identifier">T</span></code>'s assignment, the
973 state of its contained value is as defined by the exception safety
974 guarantee of <code class="computeroutput"><span class="identifier">T</span></code>'s copy
975 assignment.
976 </li>
977<li class="listitem">
978 <span class="bold"><strong>Example:</strong></span>
979<pre class="programlisting"><span class="identifier">T</span> <span class="identifier">v</span><span class="special">;</span>
980<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>
981<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>
982
983<span class="identifier">opt1</span> <span class="special">=</span> <span class="identifier">opt0</span> <span class="special">;</span>
984<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>
985</pre>
986 </li>
987</ul></div>
988<p>
989 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
990 </p>
991<a name="reference_optional_operator_move_equal_other_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
992 <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>
993 <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">optional</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">rhs</span>
994 <span class="special">)</span> <span class="special">;</span></code>
995 </p></blockquote></div>
996<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
997<li class="listitem">
998<p class="simpara">
999 <span class="bold"><strong>Effect:</strong></span>
1000 </p>
1001<div class="informaltable"><table class="table">
1002<colgroup>
1003<col>
1004<col>
1005<col>
1006</colgroup>
1007<thead><tr></tr></thead>
1008<tbody>
1009<tr>
1010<td>
1011 </td>
1012<td>
1013 <p>
1014 <span class="bold"><strong><code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> contains a value</strong></span>
1015 </p>
1016 </td>
1017<td>
1018 <p>
1019 <span class="bold"><strong><code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> does not contain a value</strong></span>
1020 </p>
1021 </td>
1022</tr>
1023<tr>
1024<td>
1025 <p>
1026 <span class="bold"><strong><code class="computeroutput"><span class="identifier">rhs</span></code>
1027 contains a value</strong></span>
1028 </p>
1029 </td>
1030<td>
1031 <p>
1032 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
1033 </p>
1034 </td>
1035<td>
1036 <p>
1037 initializes the contained value as if direct-initializing
1038 an object of type <code class="computeroutput"><span class="identifier">T</span></code>
1039 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>
1040 </p>
1041 </td>
1042</tr>
1043<tr>
1044<td>
1045 <p>
1046 <span class="bold"><strong><code class="computeroutput"><span class="identifier">rhs</span></code>
1047 does not contain a value</strong></span>
1048 </p>
1049 </td>
1050<td>
1051 <p>
1052 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>
1053 </p>
1054 </td>
1055<td>
1056 <p>
1057 no effect
1058 </p>
1059 </td>
1060</tr>
1061</tbody>
1062</table></div>
1063</li>
1064<li class="listitem">
1065 <span class="bold"><strong>Returns:</strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
1066 </li>
1067<li class="listitem">
1068 <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>.
1069 </li>
1070<li class="listitem">
1071 <span class="bold"><strong>Exception Safety:</strong></span> If any exception
1072 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
1073 is thrown during the call to <code class="computeroutput"><span class="identifier">T</span></code>'s
1074 constructor, no effect. If an exception is thrown during the call to
1075 <code class="computeroutput"><span class="identifier">T</span></code>'s assignment, the
1076 state of its contained value is as defined by the exception safety
1077 guarantee of <code class="computeroutput"><span class="identifier">T</span></code>'s copy
1078 assignment.
1079 </li>
1080<li class="listitem">
1081 <span class="bold"><strong>Example:</strong></span>
1082<pre class="programlisting"><span class="identifier">T</span> <span class="identifier">v</span><span class="special">;</span>
1083<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>
1084<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>
1085
1086<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>
1087<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">opt0</span> <span class="special">);</span>
1088<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">opt1</span> <span class="special">)</span>
1089<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>
1090</pre>
1091 </li>
1092</ul></div>
1093<p>
1094 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
1095 </p>
1096<a name="reference_optional_emplace"></a><div class="blockquote"><blockquote class="blockquote"><p>
1097 <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>
1098 <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">emplace</span><span class="special">(</span> <span class="identifier">Args</span><span class="special">&amp;&amp;...</span> <span class="identifier">args</span>
1099 <span class="special">);</span></code>
1100 </p></blockquote></div>
1101<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1102<li class="listitem">
1103 <span class="bold"><strong>Requires:</strong></span> The compiler supports rvalue
1104 references and variadic templates.
1105 </li>
1106<li class="listitem">
1107 <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>.
1108 Then initializes in-place the contained value as if direct-initializing
1109 an object of type <code class="computeroutput"><span class="identifier">T</span></code>
1110 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>.
1111 </li>
1112<li class="listitem">
1113 <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>.
1114 </li>
1115<li class="listitem">
1116 <span class="bold"><strong>Throws:</strong></span> Whatever the selected <code class="computeroutput"><span class="identifier">T</span></code>'s constructor throws.
1117 </li>
1118<li class="listitem">
1119 <span class="bold"><strong>Exception Safety:</strong></span> If an exception
1120 is thrown during the initialization of <code class="computeroutput"><span class="identifier">T</span></code>,
1121 <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1122 is <span class="emphasis"><em>uninitialized</em></span>.
1123 </li>
1124<li class="listitem">
1125 <span class="bold"><strong>Notes:</strong></span> <code class="computeroutput"><span class="identifier">T</span></code>
1126 need not be <code class="computeroutput"><span class="identifier">MoveConstructible</span></code>
1127 or <code class="computeroutput"><span class="identifier">MoveAssignable</span></code>.
1128 On compilers that do not suppor variadic templates or rvalue references,
1129 this function is available in limited functionality. For details <a class="link" href="../../dependencies_and_portability/emplace_operations_in_older_compilers.html#optional_emplace_workaround">see here</a>.
1130 </li>
1131<li class="listitem">
1132 <span class="bold"><strong>Example:</strong></span>
1133<pre class="programlisting"><span class="identifier">T</span> <span class="identifier">v</span><span class="special">;</span>
1134<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>
1135<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>
1136<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>
1137<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>
1138</pre>
1139 </li>
1140</ul></div>
1141<p>
1142 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
1143 </p>
1144<a name="reference_optional_operator_equal_factory"></a><div class="blockquote"><blockquote class="blockquote"><p>
1145 <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="identifier">InPlaceFactory</span><span class="special">&gt;</span>
1146 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&amp;</span>
1147 <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="identifier">InPlaceFactory</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">f</span> <span class="special">);</span></code>
1148 </p></blockquote></div>
1149<div class="blockquote"><blockquote class="blockquote"><p>
1150 <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="identifier">TypedInPlaceFactory</span><span class="special">&gt;</span>
1151 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&amp;</span>
1152 <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="identifier">TypedInPlaceFactory</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">f</span> <span class="special">);</span></code>
1153 </p></blockquote></div>
1154<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1155<li class="listitem">
1156 <span class="bold"><strong>Effect:</strong></span> Assigns an <code class="computeroutput"><span class="identifier">optional</span></code>
1157 with a value of <code class="computeroutput"><span class="identifier">T</span></code> obtained
1158 from the factory.
1159 </li>
1160<li class="listitem">
1161 <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>
1162 and its value is <span class="emphasis"><em>directly given</em></span> from the factory
1163 <code class="computeroutput"><span class="identifier">f</span></code> (i.e., the value
1164 <span class="underline">is not copied</span>).
1165 </li>
1166<li class="listitem">
1167 <span class="bold"><strong>Throws:</strong></span> Whatever the <code class="computeroutput"><span class="identifier">T</span></code> constructor called by the factory
1168 throws.
1169 </li>
1170<li class="listitem">
1171 <span class="bold"><strong>Notes:</strong></span> See <a class="link" href="../../tutorial/in_place_factories.html" title="In-Place Factories">In-Place
1172 Factories</a>
1173 </li>
1174<li class="listitem">
1175 <span class="bold"><strong>Exception Safety:</strong></span> Exceptions can only
1176 be thrown during the call to the <code class="computeroutput"><span class="identifier">T</span></code>
1177 constructor used by the factory; in that case, the <code class="computeroutput"><span class="identifier">optional</span></code>
1178 object will be reset to be <span class="emphasis"><em>uninitialized</em></span>.
1179 </li>
1180</ul></div>
1181<p>
1182 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
1183 </p>
1184<a name="reference_optional_reset_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
1185 <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="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>
1186 </p></blockquote></div>
1187<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
1188 <span class="bold"><strong>Deprecated:</strong></span> same as <code class="computeroutput"><span class="keyword">operator</span><span class="special">=</span>
1189 <span class="special">(</span> <span class="identifier">T</span>
1190 <span class="keyword">const</span><span class="special">&amp;</span>
1191 <span class="identifier">v</span><span class="special">)</span>
1192 <span class="special">;</span></code>
1193 </li></ul></div>
1194<p>
1195 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
1196 </p>
1197<a name="reference_optional_reset"></a><div class="blockquote"><blockquote class="blockquote"><p>
1198 <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>
1199 <span class="special">;</span></code>
1200 </p></blockquote></div>
1201<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
1202 <span class="bold"><strong>Deprecated:</strong></span> Same as <code class="computeroutput"><span class="keyword">operator</span><span class="special">=(</span>
1203 <span class="identifier">none_t</span> <span class="special">);</span></code>
1204 </li></ul></div>
1205<p>
1206 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
1207 </p>
1208<a name="reference_optional_get"></a><div class="blockquote"><blockquote class="blockquote"><p>
1209 <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">get</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">;</span></code>
1210 </p></blockquote></div>
1211<div class="blockquote"><blockquote class="blockquote"><p>
1212 <code class="computeroutput"><span class="identifier">T</span><span class="special">&amp;</span>
1213 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">get</span><span class="special">()</span> <span class="special">;</span></code>
1214 </p></blockquote></div>
1215<div class="blockquote"><blockquote class="blockquote"><p>
1216 <code class="computeroutput"><span class="keyword">inline</span> <span class="identifier">T</span>
1217 <span class="keyword">const</span><span class="special">&amp;</span>
1218 <span class="identifier">get</span> <span class="special">(</span>
1219 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">)</span> <span class="special">;</span></code>
1220 </p></blockquote></div>
1221<div class="blockquote"><blockquote class="blockquote"><p>
1222 <code class="computeroutput"><span class="keyword">inline</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">get</span>
1223 <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&amp;)</span>
1224 <span class="special">;</span></code>
1225 </p></blockquote></div>
1226<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1227<li class="listitem">
1228 <span class="bold"><strong>Requires:</strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is initialized
1229 </li>
1230<li class="listitem">
1231 <span class="bold"><strong>Returns:</strong></span> A reference to the contained
1232 value
1233 </li>
1234<li class="listitem">
1235 <span class="bold"><strong>Throws:</strong></span> Nothing.
1236 </li>
1237<li class="listitem">
1238 <span class="bold"><strong>Notes:</strong></span> The requirement is asserted
1239 via <code class="computeroutput"><span class="identifier">BOOST_ASSERT</span><span class="special">()</span></code>.
1240 </li>
1241</ul></div>
1242<p>
1243 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
1244 </p>
1245<a name="reference_optional_operator_asterisk"></a><div class="blockquote"><blockquote class="blockquote"><p>
1246 <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="keyword">operator</span><span class="special">*()</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">;</span></code>
1247 </p></blockquote></div>
1248<div class="blockquote"><blockquote class="blockquote"><p>
1249 <code class="computeroutput"><span class="identifier">T</span><span class="special">&amp;</span>
1250 <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>
1251 <span class="special">&amp;;</span></code>
1252 </p></blockquote></div>
1253<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1254<li class="listitem">
1255 <span class="bold"><strong>Requires:</strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is initialized
1256 </li>
1257<li class="listitem">
1258 <span class="bold"><strong>Returns:</strong></span> A reference to the contained
1259 value
1260 </li>
1261<li class="listitem">
1262 <span class="bold"><strong>Throws:</strong></span> Nothing.
1263 </li>
1264<li class="listitem">
1265 <span class="bold"><strong>Notes:</strong></span> The requirement is asserted
1266 via <code class="computeroutput"><span class="identifier">BOOST_ASSERT</span><span class="special">()</span></code>.
1267 On compilers that do not support ref-qualifiers on member functions
1268 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>
1269 member functions.
1270 </li>
1271<li class="listitem">
1272 <span class="bold"><strong>Example:</strong></span>
1273<pre class="programlisting"><span class="identifier">T</span> <span class="identifier">v</span> <span class="special">;</span>
1274<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>
1275<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>
1276<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>
1277<span class="identifier">T</span> <span class="identifier">w</span> <span class="special">;</span>
1278<span class="special">*</span><span class="identifier">opt</span> <span class="special">=</span> <span class="identifier">w</span> <span class="special">;</span>
1279<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>
1280</pre>
1281 </li>
1282</ul></div>
1283<p>
1284 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
1285 </p>
1286<a name="reference_optional_operator_asterisk_move"></a><div class="blockquote"><blockquote class="blockquote"><p>
1287 <code class="computeroutput"><span class="identifier">T</span><span class="special">&amp;&amp;</span>
1288 <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>
1289 <span class="special">&amp;&amp;;</span></code>
1290 </p></blockquote></div>
1291<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1292<li class="listitem">
1293 <span class="bold"><strong>Requires:</strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> contains a value.
1294 </li>
1295<li class="listitem">
1296 <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>.
1297 </li>
1298<li class="listitem">
1299 <span class="bold"><strong>Notes:</strong></span> The requirement is asserted
1300 via <code class="computeroutput"><span class="identifier">BOOST_ASSERT</span><span class="special">()</span></code>.
1301 On compilers that do not support ref-qualifiers on member functions
1302 this overload is not present.
1303 </li>
1304</ul></div>
1305<p>
1306 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
1307 </p>
1308<a name="reference_optional_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
1309 <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>
1310 </p></blockquote></div>
1311<div class="blockquote"><blockquote class="blockquote"><p>
1312 <code class="computeroutput"><span class="identifier">T</span><span class="special">&amp;</span>
1313 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">()</span> <span class="special">&amp;</span> <span class="special">;</span></code>
1314 </p></blockquote></div>
1315<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1316<li class="listitem">
1317 <span class="bold"><strong>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>.
1318 </li>
1319<li class="listitem">
1320 <span class="bold"><strong>Notes:</strong></span> On compilers that do not support
1321 ref-qualifiers on member functions these two overloads are replaced
1322 with the classical two: a <code class="computeroutput"><span class="keyword">const</span></code>
1323 and non-<code class="computeroutput"><span class="keyword">const</span></code> member functions.
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="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>
1329<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>
1330
1331<span class="keyword">try</span> <span class="special">{</span>
1332 <span class="identifier">o0</span><span class="special">.</span><span class="identifier">value</span><span class="special">();</span> <span class="comment">// throws</span>
1333 <span class="identifier">assert</span> <span class="special">(</span> <span class="keyword">false</span> <span class="special">);</span>
1334<span class="special">}</span>
1335<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>
1336 <span class="identifier">assert</span> <span class="special">(</span> <span class="keyword">true</span> <span class="special">);</span>
1337<span class="special">}</span>
1338</pre>
1339 </li>
1340</ul></div>
1341<p>
1342 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
1343 </p>
1344<a name="reference_optional_value_move"></a><div class="blockquote"><blockquote class="blockquote"><p>
1345 <code class="computeroutput"><span class="identifier">T</span><span class="special">&amp;&amp;</span>
1346 <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>
1347 </p></blockquote></div>
1348<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1349<li class="listitem">
1350 <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>.
1351 </li>
1352<li class="listitem">
1353 <span class="bold"><strong>Notes:</strong></span> On compilers that do not support
1354 ref-qualifiers on member functions this overload is not present.
1355 </li>
1356</ul></div>
1357<p>
1358 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
1359 </p>
1360<a name="reference_optional_value_or"></a><div class="blockquote"><blockquote class="blockquote"><p>
1361 <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>
1362 <span class="identifier">v</span><span class="special">)</span>
1363 <span class="keyword">const</span><span class="special">&amp;</span>
1364 <span class="special">;</span></code>
1365 </p></blockquote></div>
1366<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1367<li class="listitem">
1368 <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>
1369 <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>.
1370 </li>
1371<li class="listitem">
1372 <span class="bold"><strong>Remarks:</strong></span> If <code class="computeroutput"><span class="identifier">T</span></code>
1373 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>
1374 is not convertible to <code class="computeroutput"><span class="identifier">T</span></code>,
1375 the program is ill-formed.
1376 </li>
1377<li class="listitem">
1378 <span class="bold"><strong>Notes:</strong></span> On compilers that do not support
1379 ref-qualifiers on member functions this overload is replaced with the
1380 <code class="computeroutput"><span class="keyword">const</span></code>-qualified member
1381 function. On compilers without rvalue reference support the type of
1382 <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>.
1383 </li>
1384</ul></div>
1385<p>
1386 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
1387 </p>
1388<a name="reference_optional_value_or_move"></a><div class="blockquote"><blockquote class="blockquote"><p>
1389 <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>
1390 <span class="identifier">v</span><span class="special">)</span>
1391 <span class="special">&amp;&amp;</span> <span class="special">;</span></code>
1392 </p></blockquote></div>
1393<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1394<li class="listitem">
1395 <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>.
1396 </li>
1397<li class="listitem">
1398 <span class="bold"><strong>Remarks:</strong></span> If <code class="computeroutput"><span class="identifier">T</span></code>
1399 is not <code class="computeroutput"><span class="identifier">MoveConstructible</span></code>
1400 or <code class="computeroutput"><span class="identifier">U</span> <span class="special">&amp;&amp;</span></code>
1401 is not convertible to <code class="computeroutput"><span class="identifier">T</span></code>,
1402 the program is ill-formed.
1403 </li>
1404<li class="listitem">
1405 <span class="bold"><strong>Notes:</strong></span> On compilers that do not support
1406 ref-qualifiers on member functions this overload is not present.
1407 </li>
1408</ul></div>
1409<p>
1410 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
1411 </p>
1412<a name="reference_optional_value_or_call"></a><div class="blockquote"><blockquote class="blockquote"><p>
1413 <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>
1414 </p></blockquote></div>
1415<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1416<li class="listitem">
1417 <span class="bold"><strong>Requires:</strong></span> <code class="computeroutput"><span class="identifier">T</span></code>
1418 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
1419 is convertible to <code class="computeroutput"><span class="identifier">T</span></code>.
1420 </li>
1421<li class="listitem">
1422 <span class="bold"><strong>Effects:</strong></span> <code class="computeroutput"><span class="keyword">if</span>
1423 <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>.
1424 </li>
1425<li class="listitem">
1426 <span class="bold"><strong>Notes:</strong></span> On compilers that do not support
1427 ref-qualifiers on member functions this overload is replaced with the
1428 <code class="computeroutput"><span class="keyword">const</span></code>-qualified member
1429 function.
1430 </li>
1431<li class="listitem">
1432 <span class="bold"><strong>Example:</strong></span>
1433<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">complain_and_0</span><span class="special">()</span>
1434<span class="special">{</span>
1435 <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>
1436 <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
1437<span class="special">}</span>
1438
1439<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>
1440<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>
1441
1442<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>
1443<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>
1444
1445<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>
1446<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>
1447</pre>
1448 </li>
1449</ul></div>
1450<p>
1451 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
1452 </p>
1453<a name="reference_optional_value_or_call_move"></a><div class="blockquote"><blockquote class="blockquote"><p>
1454 <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>
1455 <span class="special">;</span></code>
1456 </p></blockquote></div>
1457<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1458<li class="listitem">
1459 <span class="bold"><strong>Requires:</strong></span> <code class="computeroutput"><span class="identifier">T</span></code>
1460 is <code class="computeroutput"><span class="identifier">MoveConstructible</span></code>
1461 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>
1462 whose result type is convertible to <code class="computeroutput"><span class="identifier">T</span></code>.
1463 </li>
1464<li class="listitem">
1465 <span class="bold"><strong>Effects:</strong></span> <code class="computeroutput"><span class="keyword">if</span>
1466 <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>
1467 <span class="identifier">f</span><span class="special">();</span></code>.
1468 </li>
1469<li class="listitem">
1470 <span class="bold"><strong>Notes:</strong></span> On compilers that do not support
1471 ref-qualifiers on member functions this overload is not present.
1472 </li>
1473</ul></div>
1474<p>
1475 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
1476 </p>
1477<a name="reference_optional_get_value_or_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
1478 <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">get_value_or</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="keyword">const</span> <span class="special">;</span></code>
1479 </p></blockquote></div>
1480<div class="blockquote"><blockquote class="blockquote"><p>
1481 <code class="computeroutput"><span class="identifier">T</span><span class="special">&amp;</span>
1482 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">get_value_or</span><span class="special">(</span>
1483 <span class="identifier">T</span><span class="special">&amp;</span>
1484 <span class="keyword">default</span> <span class="special">)</span>
1485 <span class="special">;</span></code>
1486 </p></blockquote></div>
1487<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1488<li class="listitem">
1489 <span class="bold"><strong>Deprecated:</strong></span> Use <code class="computeroutput"><span class="identifier">value_or</span><span class="special">()</span></code> instead.
1490 </li>
1491<li class="listitem">
1492 <span class="bold"><strong>Returns:</strong></span> A reference to the contained
1493 value, if any, or <code class="computeroutput"><span class="keyword">default</span></code>.
1494 </li>
1495<li class="listitem">
1496 <span class="bold"><strong>Throws:</strong></span> Nothing.
1497 </li>
1498<li class="listitem">
1499 <span class="bold"><strong>Example:</strong></span>
1500<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>
1501<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>
1502<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>
1503<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>
1504
1505<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>
1506<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">opt</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>
1507<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>
1508<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>
1509</pre>
1510 </li>
1511</ul></div>
1512<p>
1513 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
1514 </p>
1515<a name="reference_optional_get_ptr"></a><div class="blockquote"><blockquote class="blockquote"><p>
1516 <code class="computeroutput"><span class="identifier">T</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">get_ptr</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">;</span></code>
1517 </p></blockquote></div>
1518<div class="blockquote"><blockquote class="blockquote"><p>
1519 <code class="computeroutput"><span class="identifier">T</span><span class="special">*</span>
1520 <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">get_ptr</span><span class="special">()</span>
1521 <span class="special">;</span></code>
1522 </p></blockquote></div>
1523<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1524<li class="listitem">
1525 <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
1526 contained value; else <code class="computeroutput"><span class="number">0</span></code>
1527 (<span class="emphasis"><em>null</em></span>).
1528 </li>
1529<li class="listitem">
1530 <span class="bold"><strong>Throws:</strong></span> Nothing.
1531 </li>
1532<li class="listitem">
1533 <span class="bold"><strong>Notes:</strong></span> The contained value is permanently
1534 stored within <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
1535 so you should not hold nor delete this pointer
1536 </li>
1537<li class="listitem">
1538 <span class="bold"><strong>Example:</strong></span>
1539<pre class="programlisting"><span class="identifier">T</span> <span class="identifier">v</span><span class="special">;</span>
1540<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>
1541<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>
1542<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>
1543<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>
1544<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>
1545<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>
1546</pre>
1547 </li>
1548</ul></div>
1549<p>
1550 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
1551 </p>
1552<a name="reference_optional_operator_arrow"></a><div class="blockquote"><blockquote class="blockquote"><p>
1553 <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><span class="special">&gt;::</span><span class="keyword">operator</span>
1554 <span class="special">-&gt;()</span> <span class="keyword">const</span>
1555 <span class="special">;</span></code>
1556 </p></blockquote></div>
1557<div class="blockquote"><blockquote class="blockquote"><p>
1558 <code class="computeroutput"><span class="identifier">T</span><span class="special">*</span>
1559 <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">-&gt;()</span>
1560 <span class="special">;</span></code>
1561 </p></blockquote></div>
1562<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1563<li class="listitem">
1564 <span class="bold"><strong>Requires: </strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is initialized.
1565 </li>
1566<li class="listitem">
1567 <span class="bold"><strong>Returns:</strong></span> A pointer to the contained
1568 value.
1569 </li>
1570<li class="listitem">
1571 <span class="bold"><strong>Throws:</strong></span> Nothing.
1572 </li>
1573<li class="listitem">
1574 <span class="bold"><strong>Notes:</strong></span> The requirement is asserted
1575 via <code class="computeroutput"><span class="identifier">BOOST_ASSERT</span><span class="special">()</span></code>.
1576 </li>
1577<li class="listitem">
1578 <span class="bold"><strong>Example:</strong></span>
1579<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>
1580<span class="identifier">X</span> <span class="identifier">x</span> <span class="special">;</span>
1581<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>
1582<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>
1583</pre>
1584 </li>
1585</ul></div>
1586<p>
1587 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
1588 </p>
1589<a name="reference_optional_operator_bool"></a><div class="blockquote"><blockquote class="blockquote"><p>
1590 <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>
1591 <span class="keyword">bool</span><span class="special">()</span>
1592 <span class="keyword">const</span> <span class="keyword">noexcept</span>
1593 <span class="special">;</span></code>
1594 </p></blockquote></div>
1595<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1596<li class="listitem">
1597 <span class="bold"><strong>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>.
1598 </li>
1599<li class="listitem">
1600 <span class="bold"><strong>Notes:</strong></span> On compilers that do not support
1601 explicit conversion operators this falls back to safe-bool idiom.
1602 </li>
1603<li class="listitem">
1604 <span class="bold"><strong>Example:</strong></span>
1605<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>
1606<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>
1607<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>
1608<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">opt</span> <span class="special">);</span>
1609<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>
1610</pre>
1611 </li>
1612</ul></div>
1613<p>
1614 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
1615 </p>
1616<a name="reference_optional_operator_not"></a><div class="blockquote"><blockquote class="blockquote"><p>
1617 <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>
1618 <span class="special">;</span></code>
1619 </p></blockquote></div>
1620<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1621<li class="listitem">
1622 <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>.
1623 </li>
1624<li class="listitem">
1625 <span class="bold"><strong>Notes:</strong></span> This operator is provided for
1626 those compilers which can't use the <span class="emphasis"><em>unspecified-bool-type
1627 operator</em></span> in certain boolean contexts.
1628 </li>
1629<li class="listitem">
1630 <span class="bold"><strong>Example:</strong></span>
1631<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>
1632<span class="identifier">assert</span> <span class="special">(</span> <span class="special">!</span><span class="identifier">opt</span> <span class="special">);</span>
1633<span class="special">*</span><span class="identifier">opt</span> <span class="special">=</span> <span class="identifier">some_T</span> <span class="special">;</span>
1634
1635<span class="comment">// Notice the "double-bang" idiom here.</span>
1636<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>
1637</pre>
1638 </li>
1639</ul></div>
1640<p>
1641 <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
1642 </p>
1643<a name="reference_optional_is_initialized"></a><div class="blockquote"><blockquote class="blockquote"><p>
1644 <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>
1645 </p></blockquote></div>
1646<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
1647 <span class="bold"><strong>Deprecated:</strong></span> Same as <code class="computeroutput"><span class="keyword">explicit</span> <span class="keyword">operator</span>
1648 <span class="keyword">bool</span> <span class="special">()</span>
1649 <span class="special">;</span></code>
1650 </li></ul></div>
1651</div>
1652<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
1653<td align="left"></td>
1654<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>
1655 Distributed under the Boost Software License, Version 1.0. (See accompanying
1656 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>)
1657 </p>
1658</div></td>
1659</tr></table>
1660<hr>
1661<div class="spirit-nav">
1662<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>
1663</div>
1664</body>
1665</html>