]> git.proxmox.com Git - ceph.git/blob - 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
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>