detailed_semantics___optional_values.html 173 KB

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