9
3

detailed_semantics____optional_values.html 191 KB

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