detailed_semantics.html 207 KB

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