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