tutorial.html 234 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
  4. <title>Tutorial</title>
  5. <link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css">
  6. <meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
  7. <link rel="home" href="../index.html" title="Chapter&#160;1.&#160;Boost.Contract 1.0.0">
  8. <link rel="up" href="../index.html" title="Chapter&#160;1.&#160;Boost.Contract 1.0.0">
  9. <link rel="prev" href="contract_programming_overview.html" title="Contract Programming Overview">
  10. <link rel="next" href="advanced.html" title="Advanced">
  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="contract_programming_overview.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="advanced.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_contract.tutorial"></a><a class="link" href="tutorial.html" title="Tutorial">Tutorial</a>
  28. </h2></div></div></div>
  29. <div class="toc"><dl class="toc">
  30. <dt><span class="section"><a href="tutorial.html#boost_contract.tutorial.non_member_functions">Non-Member
  31. Functions</a></span></dt>
  32. <dt><span class="section"><a href="tutorial.html#boost_contract.tutorial.preconditions">Preconditions</a></span></dt>
  33. <dt><span class="section"><a href="tutorial.html#boost_contract.tutorial.postconditions">Postconditions</a></span></dt>
  34. <dt><span class="section"><a href="tutorial.html#boost_contract.tutorial.return_values">Return Values</a></span></dt>
  35. <dt><span class="section"><a href="tutorial.html#boost_contract.tutorial.old_values">Old Values</a></span></dt>
  36. <dt><span class="section"><a href="tutorial.html#boost_contract.tutorial.exception_guarantees">Exception
  37. Guarantees</a></span></dt>
  38. <dt><span class="section"><a href="tutorial.html#boost_contract.tutorial.class_invariants">Class Invariants</a></span></dt>
  39. <dt><span class="section"><a href="tutorial.html#boost_contract.tutorial.constructors">Constructors</a></span></dt>
  40. <dt><span class="section"><a href="tutorial.html#boost_contract.tutorial.destructors">Destructors</a></span></dt>
  41. <dt><span class="section"><a href="tutorial.html#boost_contract.tutorial.public_functions">Public Functions</a></span></dt>
  42. <dt><span class="section"><a href="tutorial.html#boost_contract.tutorial.virtual_public_functions">Virtual
  43. Public Functions</a></span></dt>
  44. <dt><span class="section"><a href="tutorial.html#boost_contract.tutorial.public_function_overrides__subcontracting_">Public
  45. Function Overrides (Subcontracting)</a></span></dt>
  46. <dt><span class="section"><a href="tutorial.html#boost_contract.tutorial.base_classes__subcontracting_">Base
  47. Classes (Subcontracting)</a></span></dt>
  48. <dt><span class="section"><a href="tutorial.html#boost_contract.tutorial.static_public_functions">Static
  49. Public Functions</a></span></dt>
  50. </dl></div>
  51. <p>
  52. This section is a guide to basic usage of this library.
  53. </p>
  54. <div class="section">
  55. <div class="titlepage"><div><div><h3 class="title">
  56. <a name="boost_contract.tutorial.non_member_functions"></a><a class="link" href="tutorial.html#boost_contract.tutorial.non_member_functions" title="Non-Member Functions">Non-Member
  57. Functions</a>
  58. </h3></div></div></div>
  59. <p>
  60. Contracts for non-member functions are programmed using <code class="computeroutput"><a class="link" href="../boost/contract/function.html" title="Function function">boost::contract::function</a></code>.
  61. For example (see <a href="../../../example/features/non_member.cpp" target="_top"><code class="literal">non_member.cpp</code></a>):
  62. </p>
  63. <p>
  64. </p>
  65. <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">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  66. <span class="comment">// Contract for a non-member function.</span>
  67. <span class="keyword">int</span> <span class="identifier">inc</span><span class="special">(</span><span class="keyword">int</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">)</span> <span class="special">{</span>
  68. <span class="keyword">int</span> <span class="identifier">result</span><span class="special">;</span>
  69. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">old_x</span> <span class="special">=</span> <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">x</span><span class="special">);</span>
  70. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">function</span><span class="special">()</span>
  71. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  72. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">x</span> <span class="special">&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;::</span><span class="identifier">max</span><span class="special">());</span>
  73. <span class="special">})</span>
  74. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  75. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">x</span> <span class="special">==</span> <span class="special">*</span><span class="identifier">old_x</span> <span class="special">+</span> <span class="number">1</span><span class="special">);</span>
  76. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">result</span> <span class="special">==</span> <span class="special">*</span><span class="identifier">old_x</span><span class="special">);</span>
  77. <span class="special">})</span>
  78. <span class="special">.</span><span class="identifier">except</span><span class="special">([&amp;]</span> <span class="special">{</span>
  79. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">x</span> <span class="special">==</span> <span class="special">*</span><span class="identifier">old_x</span><span class="special">);</span>
  80. <span class="special">})</span>
  81. <span class="special">;</span>
  82. <span class="keyword">return</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">x</span><span class="special">++;</span> <span class="comment">// Function body.</span>
  83. <span class="special">}</span>
  84. </pre>
  85. <p>
  86. </p>
  87. <p>
  88. All necessary header files of this library are included by <code class="computeroutput"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span></code>.
  89. Alternatively, programmers can selectively include only the header files
  90. they actually need among <code class="literal">boost/contract/*.hpp</code> (see <a class="link" href="getting_started.html" title="Getting Started">Getting Started</a>).
  91. </p>
  92. <p>
  93. It is possible to specify preconditions, postconditions, and exception guarantees
  94. for non-member functions (see <a class="link" href="tutorial.html#boost_contract.tutorial.preconditions" title="Preconditions">Preconditions</a>,
  95. <a class="link" href="tutorial.html#boost_contract.tutorial.postconditions" title="Postconditions">Postconditions</a>,
  96. and <a class="link" href="tutorial.html#boost_contract.tutorial.exception_guarantees" title="Exception Guarantees">Exception
  97. Guarantees</a>).
  98. </p>
  99. <p>
  100. The <code class="computeroutput"><a class="link" href="../boost/contract/function.html" title="Function function">boost::contract::function</a></code>
  101. function returns an RAII object that must always be assigned to a local variable
  102. of type <code class="computeroutput"><a class="link" href="../boost/contract/check.html" title="Class check">boost::contract::check</a></code>
  103. (otherwise this library will generate a run-time error, see <code class="computeroutput"><a class="link" href="../BOOST_CO_idm45394999694064.html" title="Macro BOOST_CONTRACT_ON_MISSING_CHECK_DECL">BOOST_CONTRACT_ON_MISSING_CHECK_DECL</a></code>).
  104. <a href="#ftn.boost_contract.tutorial.non_member_functions.f0" class="footnote" name="boost_contract.tutorial.non_member_functions.f0"><sup class="footnote">[19]</sup></a> Furthermore, C++11 <code class="computeroutput"><span class="keyword">auto</span></code>
  105. declarations cannot be used here and the <code class="computeroutput"><a class="link" href="../boost/contract/check.html" title="Class check">boost::contract::check</a></code>
  106. type must be explicitly specified (otherwise this library will generate a
  107. compile-time error prior C++17 and a run-time error post C++17). <a href="#ftn.boost_contract.tutorial.non_member_functions.f1" class="footnote" name="boost_contract.tutorial.non_member_functions.f1"><sup class="footnote">[20]</sup></a> The function body is programmed right after the declaration of
  108. this RAII object.
  109. </p>
  110. <div class="note"><table border="0" summary="Note">
  111. <tr>
  112. <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td>
  113. <th align="left">Note</th>
  114. </tr>
  115. <tr><td align="left" valign="top"><p>
  116. In some cases, it might be necessary to program some code before the contract.
  117. For example for acquiring resources that will be used while checking the
  118. contract like old values, but also to lock mutexes (or other synchronization
  119. mechanisms) in multi-threaded programs.
  120. </p></td></tr>
  121. </table></div>
  122. <p>
  123. At construction, the <code class="computeroutput"><a class="link" href="../boost/contract/check.html" title="Class check">boost::contract::check</a></code>
  124. RAII object for non-member functions does the following (enclosing function
  125. entry):
  126. </p>
  127. <div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem">
  128. Check preconditions, by calling the nullary functor <code class="literal"><span class="emphasis"><em>r</em></span></code><code class="computeroutput"><span class="special">()</span></code> passed to <code class="computeroutput"><span class="special">.</span><span class="identifier">precondition</span><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>r</em></span></code><code class="computeroutput"><span class="special">)</span></code>.
  129. </li></ol></div>
  130. <p>
  131. At destruction instead (enclosing function exit):
  132. </p>
  133. <div class="orderedlist"><ol class="orderedlist" type="1">
  134. <li class="listitem">
  135. If the function body did not throw an exception:
  136. <div class="orderedlist"><ol class="orderedlist" type="a"><li class="listitem">
  137. Check postconditions, by calling the nullary functor <code class="literal"><span class="emphasis"><em>s</em></span></code><code class="computeroutput"><span class="special">()</span></code> passed to <code class="computeroutput"><span class="special">.</span><span class="identifier">postcondition</span><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>s</em></span></code><code class="computeroutput"><span class="special">)</span></code>.
  138. </li></ol></div>
  139. </li>
  140. <li class="listitem">
  141. Else:
  142. <div class="orderedlist"><ol class="orderedlist" type="a"><li class="listitem">
  143. Check exception guarantees, by calling the nullary functor <code class="literal"><span class="emphasis"><em>e</em></span></code><code class="computeroutput"><span class="special">()</span></code> passed to <code class="computeroutput"><span class="special">.</span><span class="identifier">except</span><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>e</em></span></code><code class="computeroutput"><span class="special">)</span></code>.
  144. </li></ol></div>
  145. </li>
  146. </ol></div>
  147. <p>
  148. This ensures that non-member function contracts are correctly checked at
  149. run-time (see <a class="link" href="contract_programming_overview.html#boost_contract.contract_programming_overview.function_calls" title="Function Calls">Function
  150. Calls</a>). (Also note that functions will correctly check their contracts
  151. even when they are called via function pointers, function objects, etc.)
  152. </p>
  153. <div class="note"><table border="0" summary="Note">
  154. <tr>
  155. <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td>
  156. <th align="left">Note</th>
  157. </tr>
  158. <tr><td align="left" valign="top"><p>
  159. A non-member function can avoid calling <code class="computeroutput"><a class="link" href="../boost/contract/function.html" title="Function function">boost::contract::function</a></code>
  160. for efficiency but only when it has no preconditions, no postconditions,
  161. and no exception guarantees.
  162. </p></td></tr>
  163. </table></div>
  164. </div>
  165. <div class="section">
  166. <div class="titlepage"><div><div><h3 class="title">
  167. <a name="boost_contract.tutorial.preconditions"></a><a class="link" href="tutorial.html#boost_contract.tutorial.preconditions" title="Preconditions">Preconditions</a>
  168. </h3></div></div></div>
  169. <p>
  170. When preconditions are specified, they are programmed using a functor <code class="literal"><span class="emphasis"><em>r</em></span></code>
  171. passed to <code class="computeroutput"><span class="special">.</span><span class="identifier">precondition</span><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>r</em></span></code><code class="computeroutput"><span class="special">)</span></code> that can be called with no parameters as
  172. in <code class="literal"><span class="emphasis"><em>r</em></span></code><code class="computeroutput"><span class="special">()</span></code>.
  173. Contracts that do not have preconditions simply do not call <code class="computeroutput"><span class="special">.</span><span class="identifier">precondition</span><span class="special">(...)</span></code>. Preconditions must appear before postconditions
  174. and exception guarantees when these are all present (see <a class="link" href="tutorial.html#boost_contract.tutorial.postconditions" title="Postconditions">Postconditions</a>
  175. and <a class="link" href="tutorial.html#boost_contract.tutorial.exception_guarantees" title="Exception Guarantees">Exception
  176. Guarantees</a>).
  177. </p>
  178. <p>
  179. C++11 lambda functions are convenient to program preconditions, but any other
  180. nullary functor can be used (see <a class="link" href="extras.html#boost_contract.extras.no_lambda_functions__no_c__11_" title="No Lambda Functions (No C++11)">No
  181. Lambda Functions</a>). <a href="#ftn.boost_contract.tutorial.preconditions.f0" class="footnote" name="boost_contract.tutorial.preconditions.f0"><sup class="footnote">[21]</sup></a> For example, for <code class="computeroutput"><a class="link" href="../boost/contract/function.html" title="Function function">boost::contract::function</a></code>
  182. (similarly for public functions, instead destructors do not have preconditions
  183. and constructors use <code class="computeroutput"><a class="link" href="../boost/contract/constructor_precondition.html" title="Class template constructor_precondition">boost::contract::constructor_precondition</a></code>,
  184. see <a class="link" href="tutorial.html#boost_contract.tutorial.public_functions" title="Public Functions">Public Functions</a>,
  185. <a class="link" href="tutorial.html#boost_contract.tutorial.destructors" title="Destructors">Destructors</a>, and
  186. <a class="link" href="tutorial.html#boost_contract.tutorial.constructors" title="Constructors">Constructors</a>):
  187. </p>
  188. <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">f</span><span class="special">(...)</span> <span class="special">{</span>
  189. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">function</span><span class="special">()</span> <span class="comment">// Same for all other contracts.</span>
  190. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span> <span class="comment">// Capture by reference or value...</span>
  191. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(...);</span> <span class="comment">// ...and should not modify captures.</span>
  192. <span class="special">...</span>
  193. <span class="special">})</span>
  194. <span class="special">...</span>
  195. <span class="special">;</span>
  196. <span class="special">...</span>
  197. <span class="special">}</span>
  198. </pre>
  199. <p>
  200. The precondition functor should capture all the variables that it needs to
  201. assert the preconditions. These variables can be captured by value when the
  202. overhead of copying such variables is acceptable. <a href="#ftn.boost_contract.tutorial.preconditions.f1" class="footnote" name="boost_contract.tutorial.preconditions.f1"><sup class="footnote">[22]</sup></a> In any case, programmers should not write precondition assertions
  203. that modify the value of the captured variables, even when those are captured
  204. by reference (see <a class="link" href="contract_programming_overview.html#boost_contract.contract_programming_overview.constant_correctness" title="Constant-Correctness">Constant-Correctness</a>).
  205. </p>
  206. <p>
  207. Any code can be programmed in the precondition functor, but it is recommended
  208. to keep this code simple using mainly assertions and if-statements (to avoid
  209. programming complex preconditions that might be buggy and also slow to check
  210. at run-time). It is also recommended to use <code class="computeroutput"><a class="link" href="../BOOST_CONTRACT_ASSERT.html" title="Macro BOOST_CONTRACT_ASSERT">BOOST_CONTRACT_ASSERT</a></code>
  211. to program precondition assertions because that enables this library to print
  212. informative error messages when the asserted conditions are evaluated to
  213. be false (note that this is not a variadic macro, see <a class="link" href="extras.html#boost_contract.extras.no_macros__and_no_variadic_macros_" title="No Macros (and No Variadic Macros)">No
  214. Macros</a>):
  215. </p>
  216. <pre class="programlisting"><span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><code class="literal"><span class="emphasis"><em>boolean-condition</em></span></code><span class="special">)</span>
  217. <span class="comment">// Or, if `boolean-condition` contains commas `,` not already within parenthesis `()`...</span>
  218. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">((</span><code class="literal"><span class="emphasis"><em>boolean-condition</em></span></code><span class="special">))</span> <span class="comment">// ...use extra parenthesis (not a variadic macro).</span>
  219. </pre>
  220. <p>
  221. This library will automatically call the failure handler <code class="computeroutput"><a class="link" href="../boost/contract/precondition_failure.html" title="Function precondition_failure">boost::contract::precondition_failure</a></code>
  222. if any of the <code class="computeroutput"><a class="link" href="../BOOST_CONTRACT_ASSERT.html" title="Macro BOOST_CONTRACT_ASSERT">BOOST_CONTRACT_ASSERT</a></code>
  223. conditions are false or, more in general, if calling the functor specified
  224. via <code class="computeroutput"><span class="special">.</span><span class="identifier">precondition</span><span class="special">(...)</span></code> throws any exception. By default, this
  225. failure handler prints an error message to <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">cerr</span></code>
  226. and terminates the program calling <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">terminate</span></code>
  227. (see <a class="link" href="advanced.html#boost_contract.advanced.throw_on_failures__and__noexcept__" title="Throw on Failures (and noexcept)">Throw
  228. on Failures</a> to change the failure handler to throw exceptions, exit
  229. the program with an error code, etc.).
  230. </p>
  231. <div class="note"><table border="0" summary="Note">
  232. <tr>
  233. <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td>
  234. <th align="left">Note</th>
  235. </tr>
  236. <tr><td align="left" valign="top"><p>
  237. Contracts are most useful when their assertions only use public members
  238. that are accessible to the caller so the caller can properly check and
  239. use the contract. In particular, preconditions of a public function or
  240. constructor that use non-public members are essentially incorrect because
  241. they cannot be fully checked by the caller (in fact, Eiffel generates a
  242. compile-time error in this case). However, this library does not enforce
  243. such a constraint and it leaves it up to programmers to only use public
  244. members when programming contracts, especially when asserting preconditions
  245. (see <a class="link" href="contract_programming_overview.html#boost_contract.contract_programming_overview.specifications_vs__implementation" title="Specifications vs. Implementation">Specifications
  246. vs. Implementation</a>).
  247. </p></td></tr>
  248. </table></div>
  249. </div>
  250. <div class="section">
  251. <div class="titlepage"><div><div><h3 class="title">
  252. <a name="boost_contract.tutorial.postconditions"></a><a class="link" href="tutorial.html#boost_contract.tutorial.postconditions" title="Postconditions">Postconditions</a>
  253. </h3></div></div></div>
  254. <p>
  255. When postconditions are specified, they are programmed using a functor <code class="literal"><span class="emphasis"><em>s</em></span></code>
  256. passed to <code class="computeroutput"><span class="special">.</span><span class="identifier">postcondition</span><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>s</em></span></code><code class="computeroutput"><span class="special">)</span></code> that can be called with no parameters as
  257. in <code class="literal"><span class="emphasis"><em>s</em></span></code><code class="computeroutput"><span class="special">()</span></code>.
  258. Contracts that do not have postconditions simply do not call <code class="computeroutput"><span class="special">.</span><span class="identifier">postcondition</span><span class="special">(...)</span></code>. Postconditions must appear after preconditions
  259. but before exception guarantees when these are all present (see <a class="link" href="tutorial.html#boost_contract.tutorial.preconditions" title="Preconditions">Preconditions</a>
  260. and <a class="link" href="tutorial.html#boost_contract.tutorial.exception_guarantees" title="Exception Guarantees">Exception
  261. Guarantees</a>).
  262. </p>
  263. <p>
  264. C++11 lambda functions are convenient to program postconditions, but any
  265. other nullary functor can be used (see <a class="link" href="extras.html#boost_contract.extras.no_lambda_functions__no_c__11_" title="No Lambda Functions (No C++11)">No
  266. Lambda Functions</a>). For example, for <code class="computeroutput"><a class="link" href="../boost/contract/function.html" title="Function function">boost::contract::function</a></code>
  267. (similarly for all other contracts):
  268. </p>
  269. <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">f</span><span class="special">(...)</span> <span class="special">{</span>
  270. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">function</span><span class="special">()</span> <span class="comment">// Same for all other contracts.</span>
  271. <span class="special">...</span>
  272. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span> <span class="comment">// Capture by reference...</span>
  273. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(...);</span> <span class="comment">// ...but should not modify captures.</span>
  274. <span class="special">...</span>
  275. <span class="special">})</span>
  276. <span class="special">...</span>
  277. <span class="special">;</span>
  278. <span class="special">...</span>
  279. <span class="special">}</span>
  280. </pre>
  281. <p>
  282. The postcondition functor should capture all the variables that it needs
  283. to assert the postconditions. In general, these variables should be captured
  284. by reference and not by value (because postconditions need to access the
  285. value that these variables will have at function exit, and not the value
  286. these variables had when the postcondition functor was first declared). Postconditions
  287. can also capture return and old values (see <a class="link" href="tutorial.html#boost_contract.tutorial.return_values" title="Return Values">Return
  288. Values</a> and <a class="link" href="tutorial.html#boost_contract.tutorial.old_values" title="Old Values">Old
  289. Values</a>). In any case, programmers should not write postcondition assertions
  290. that modify the value of the captured variables, even when those are captured
  291. by reference (see <a class="link" href="contract_programming_overview.html#boost_contract.contract_programming_overview.constant_correctness" title="Constant-Correctness">Constant-Correctness</a>).
  292. </p>
  293. <p>
  294. Any code can be programmed in the postcondition functor, but it is recommended
  295. to keep this code simple using mainly assertions and if-statements (to avoid
  296. programming complex postconditions that might be buggy and slow to check
  297. at run-time). It is also recommended to use <code class="computeroutput"><a class="link" href="../BOOST_CONTRACT_ASSERT.html" title="Macro BOOST_CONTRACT_ASSERT">BOOST_CONTRACT_ASSERT</a></code>
  298. to program postcondition assertions because that enables this library to
  299. print informative error messages when the asserted conditions are evaluated
  300. to be false (note that this is not a variadic macro, see <a class="link" href="extras.html#boost_contract.extras.no_macros__and_no_variadic_macros_" title="No Macros (and No Variadic Macros)">No
  301. Macros</a>):
  302. </p>
  303. <pre class="programlisting"><span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><code class="literal"><span class="emphasis"><em>boolean-condition</em></span></code><span class="special">)</span>
  304. <span class="comment">// Or, if `boolean-condition` has commas `,` not already within parenthesis `()`...</span>
  305. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">((</span><code class="literal"><span class="emphasis"><em>boolean-condition</em></span></code><span class="special">))</span> <span class="comment">// ...use extra parenthesis (not a variadic macro).</span>
  306. </pre>
  307. <p>
  308. This library will automatically call the failure handler <code class="computeroutput"><a class="link" href="../boost/contract/postcondition_failure.html" title="Function postcondition_failure">boost::contract::postcondition_failure</a></code>
  309. if any of the <code class="computeroutput"><a class="link" href="../BOOST_CONTRACT_ASSERT.html" title="Macro BOOST_CONTRACT_ASSERT">BOOST_CONTRACT_ASSERT</a></code>
  310. conditions are false or, more in general, if calling the functor specified
  311. via <code class="computeroutput"><span class="special">.</span><span class="identifier">postcondition</span><span class="special">(...)</span></code> throws any exception. By default, this
  312. failure handler prints an error message to <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">cerr</span></code>
  313. and terminates the program calling <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">terminate</span></code>
  314. (see <a class="link" href="advanced.html#boost_contract.advanced.throw_on_failures__and__noexcept__" title="Throw on Failures (and noexcept)">Throw
  315. on Failures</a> to change the failure handler to throw exceptions, exit
  316. the program with an error code, etc.).
  317. </p>
  318. <p>
  319. For non-void virtual public functions and non-void public function overrides,
  320. the functor <code class="literal"><span class="emphasis"><em>s</em></span></code> passed to <code class="computeroutput"><span class="special">.</span><span class="identifier">postcondition</span><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>s</em></span></code><code class="computeroutput"><span class="special">)</span></code> is not a nullary functor, instead it is
  321. a unary functor taking a variable holding the return value as its one parameter
  322. <code class="literal"><span class="emphasis"><em>s</em></span></code><code class="computeroutput"><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>result</em></span></code><code class="computeroutput"><span class="special">)</span></code> (this is to properly support subcontracting,
  323. see <a class="link" href="tutorial.html#boost_contract.tutorial.virtual_public_functions" title="Virtual Public Functions">Virtual
  324. Public Functions</a> and <a class="link" href="tutorial.html#boost_contract.tutorial.public_function_overrides__subcontracting_" title="Public Function Overrides (Subcontracting)">Public
  325. Function Overrides</a>).
  326. </p>
  327. </div>
  328. <div class="section">
  329. <div class="titlepage"><div><div><h3 class="title">
  330. <a name="boost_contract.tutorial.return_values"></a><a class="link" href="tutorial.html#boost_contract.tutorial.return_values" title="Return Values">Return Values</a>
  331. </h3></div></div></div>
  332. <p>
  333. In non-void functions, postconditions might need to access the function return
  334. value to program assertions. In these cases, programmers are responsible
  335. to declare a local variable before the contract and to assign it to the return
  336. value at function exit (when the function does not throw an exception).
  337. <a href="#ftn.boost_contract.tutorial.return_values.f0" class="footnote" name="boost_contract.tutorial.return_values.f0"><sup class="footnote">[23]</sup></a> For example, for <code class="computeroutput"><a class="link" href="../boost/contract/function.html" title="Function function">boost::contract::function</a></code>
  338. (similarly for all other contracts):
  339. </p>
  340. <pre class="programlisting"><span class="identifier">return_type</span> <span class="identifier">f</span><span class="special">(...)</span> <span class="special">{</span>
  341. <span class="identifier">return_type</span> <span class="identifier">result</span><span class="special">;</span> <span class="comment">// Must be later assigned to return value.</span>
  342. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">function</span><span class="special">()</span> <span class="comment">// Same for all other contracts.</span>
  343. <span class="special">...</span>
  344. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span> <span class="comment">// Also capture `result` reference...</span>
  345. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">result</span> <span class="special">==</span> <span class="special">...);</span> <span class="comment">// ...but should not modify captures.</span>
  346. <span class="special">...</span>
  347. <span class="special">})</span>
  348. <span class="special">...</span>
  349. <span class="special">;</span>
  350. <span class="special">...</span>
  351. <span class="keyword">return</span> <span class="identifier">result</span> <span class="special">=</span> <span class="special">...;</span> <span class="comment">// Assign `result` at each return.</span>
  352. <span class="special">}</span>
  353. </pre>
  354. <p>
  355. At any point where the enclosing function returns, programmers are responsible
  356. to assign the result variable to the expression being returned. This can
  357. be done ensuring that <span class="emphasis"><em>all</em></span> <code class="computeroutput"><span class="keyword">return</span></code>
  358. statements in the function are of the form:
  359. </p>
  360. <pre class="programlisting"><code class="literal"><span class="emphasis"><em>return-type</em></span></code> <span class="identifier">result</span><span class="special">;</span>
  361. <span class="special">...</span>
  362. <span class="keyword">return</span> <span class="identifier">result</span> <span class="special">=</span> <code class="literal"><span class="emphasis"><em>return-expression</em></span></code><span class="special">;</span> <span class="comment">// Assign `result` at each return.</span>
  363. </pre>
  364. <p>
  365. The functor used to program postconditions should capture the result variable
  366. by reference and not by value (because postconditions must access the value
  367. the result variable will have at function exit, and not the value the result
  368. variable had when the postcondition functor was first declared). The return
  369. value should never be used in preconditions, old value copies, or exception
  370. guarantees (because the return value is not yet correctly evaluated and set
  371. when preconditions are checked, old values are copied, or if the function
  372. throws an exception). In any case, programmers should not modify the result
  373. variable in the contract assertions (see <a class="link" href="contract_programming_overview.html#boost_contract.contract_programming_overview.constant_correctness" title="Constant-Correctness">Constant-Correctness</a>).
  374. </p>
  375. <p>
  376. It is also possible to declared the result variable using <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">optional</span></code>
  377. when the function return type does not have a default constructor, or if
  378. the default constructor is too expensive or undesirable to execute when first
  379. declaring the result variable (see <a class="link" href="advanced.html#boost_contract.advanced.optional_return_values" title="Optional Return Values">Optional
  380. Return Values</a>).
  381. </p>
  382. <p>
  383. Non-void virtual public functions and non-void public function overrides
  384. must always declare and use a result variable even when postconditions do
  385. not directly use the function return value (this is to properly support subcontracting,
  386. see <a class="link" href="tutorial.html#boost_contract.tutorial.virtual_public_functions" title="Virtual Public Functions">Virtual
  387. Public Functions</a> and <a class="link" href="tutorial.html#boost_contract.tutorial.public_function_overrides__subcontracting_" title="Public Function Overrides (Subcontracting)">Public
  388. Function Overrides</a>).
  389. </p>
  390. </div>
  391. <div class="section">
  392. <div class="titlepage"><div><div><h3 class="title">
  393. <a name="boost_contract.tutorial.old_values"></a><a class="link" href="tutorial.html#boost_contract.tutorial.old_values" title="Old Values">Old Values</a>
  394. </h3></div></div></div>
  395. <p>
  396. When old values are used in postconditions or in exception guarantees, programmes
  397. are responsible to declare local variables before the contract and to assign
  398. them to related old value expressions using <code class="computeroutput"><a class="link" href="../BOOST_CONTRACT_OLDOF.html" title="Macro BOOST_CONTRACT_OLDOF">BOOST_CONTRACT_OLDOF</a></code>.
  399. <a href="#ftn.boost_contract.tutorial.old_values.f0" class="footnote" name="boost_contract.tutorial.old_values.f0"><sup class="footnote">[24]</sup></a> For example, for <code class="computeroutput"><a class="link" href="../boost/contract/function.html" title="Function function">boost::contract::function</a></code>
  400. (similarly for all other contracts):
  401. </p>
  402. <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">f</span><span class="special">(...)</span> <span class="special">{</span>
  403. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="identifier">old_type</span><span class="special">&gt;</span> <span class="identifier">old_var</span> <span class="special">=</span> <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">old_expr</span><span class="special">);</span>
  404. <span class="special">...</span> <span class="comment">// More old value declarations here if needed.</span>
  405. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">function</span><span class="special">()</span> <span class="comment">// Same for all other contracts.</span>
  406. <span class="special">...</span> <span class="comment">// Preconditions shall not use old values.</span>
  407. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span> <span class="comment">// Capture by reference...</span>
  408. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(*</span><span class="identifier">old_var</span> <span class="special">==</span> <span class="special">...);</span> <span class="comment">// ...but should not modify captures.</span>
  409. <span class="special">...</span>
  410. <span class="special">})</span>
  411. <span class="special">.</span><span class="identifier">except</span><span class="special">([&amp;]</span> <span class="special">{</span> <span class="comment">// Capture by reference...</span>
  412. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">old_var</span><span class="special">-&gt;...);</span> <span class="comment">// ...but should not modify captures.</span>
  413. <span class="special">...</span>
  414. <span class="special">})</span>
  415. <span class="special">;</span>
  416. <span class="special">...</span>
  417. <span class="special">}</span>
  418. </pre>
  419. <p>
  420. Old values are handled by this library using the smart pointer class template
  421. <code class="computeroutput"><a class="link" href="../boost/contract/old_ptr.html" title="Class template old_ptr">boost::contract::old_ptr</a></code>
  422. (so programmers do not directly manage allocation and deallocation of the
  423. pointed memory). <a href="#ftn.boost_contract.tutorial.old_values.f1" class="footnote" name="boost_contract.tutorial.old_values.f1"><sup class="footnote">[25]</sup></a> The pointed old value type is automatically qualified as <code class="computeroutput"><span class="keyword">const</span></code> (so old values cannot be mistakenly
  424. changed by contract assertions, see <a class="link" href="contract_programming_overview.html#boost_contract.contract_programming_overview.constant_correctness" title="Constant-Correctness">Constant-Correctness</a>).
  425. This library ensures that old value pointers are always not null by the time
  426. postconditions and exception guarantees are checked (so programmers can safely
  427. dereference and use these pointers in postcondition and exception guarantee
  428. assertions using <code class="computeroutput"><span class="keyword">operator</span><span class="special">*</span></code>
  429. and <code class="computeroutput"><span class="keyword">operator</span><span class="special">-&gt;</span></code>
  430. without having to check if old value pointers are not null first).
  431. </p>
  432. <p>
  433. Old values should not be used in preconditions and this library does not
  434. guarantee that old value pointers are always not null when preconditions
  435. are checked. <a href="#ftn.boost_contract.tutorial.old_values.f2" class="footnote" name="boost_contract.tutorial.old_values.f2"><sup class="footnote">[26]</sup></a> See <a class="link" href="advanced.html#boost_contract.advanced.old_values_copied_at_body" title="Old Values Copied at Body">Old
  436. Values Copied at Body</a> for delaying the copy of old values until after
  437. class invariants (for constructors, destructors, and public functions) and
  438. preconditions are checked (when necessary, this allows to program old value
  439. expressions under the simplifying assumption that class invariant and precondition
  440. assertions are satisfied already).
  441. </p>
  442. <p>
  443. <code class="computeroutput"><a class="link" href="../BOOST_CONTRACT_OLDOF.html" title="Macro BOOST_CONTRACT_OLDOF">BOOST_CONTRACT_OLDOF</a></code> is
  444. a variadic macro and it takes an extra parameter when used in virtual public
  445. functions or public function overrides (see <a class="link" href="tutorial.html#boost_contract.tutorial.virtual_public_functions" title="Virtual Public Functions">Virtual
  446. Public Functions</a> and <a class="link" href="tutorial.html#boost_contract.tutorial.public_function_overrides__subcontracting_" title="Public Function Overrides (Subcontracting)">Public
  447. Function Overrides</a>). C++11 auto declarations can be used with <code class="computeroutput"><a class="link" href="../BOOST_CONTRACT_OLDOF.html" title="Macro BOOST_CONTRACT_OLDOF">BOOST_CONTRACT_OLDOF</a></code> for brevity
  448. <code class="computeroutput"><span class="keyword">auto</span> </code><code class="literal">old_<span class="emphasis"><em>variable-name</em></span>
  449. = BOOST_CONTRACT_OLDOF(<span class="emphasis"><em>expression</em></span>)</code> (but see
  450. also <a class="link" href="extras.html#boost_contract.extras.old_value_requirements__templates_" title="Old Value Requirements (Templates)">Old
  451. Value Requirements</a>). See <a class="link" href="extras.html#boost_contract.extras.no_macros__and_no_variadic_macros_" title="No Macros (and No Variadic Macros)">No
  452. Macros</a> to program old values without using <code class="computeroutput"><a class="link" href="../BOOST_CONTRACT_OLDOF.html" title="Macro BOOST_CONTRACT_OLDOF">BOOST_CONTRACT_OLDOF</a></code>
  453. (e.g., on compilers that do not support variadic macros).
  454. </p>
  455. <div class="note"><table border="0" summary="Note">
  456. <tr>
  457. <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td>
  458. <th align="left">Note</th>
  459. </tr>
  460. <tr><td align="left" valign="top"><p>
  461. This library ensures that old values are copied only once. This library
  462. also ensures that old values are never copied when postconditions and exception
  463. guarantees are disabled defining both <code class="computeroutput"><a class="link" href="../BOOST_CO_idm45394999656032.html" title="Macro BOOST_CONTRACT_NO_POSTCONDITIONS">BOOST_CONTRACT_NO_POSTCONDITIONS</a></code>
  464. and <code class="computeroutput"><a class="link" href="../BOOST_CONTRACT_NO_EXCEPTS.html" title="Macro BOOST_CONTRACT_NO_EXCEPTS">BOOST_CONTRACT_NO_EXCEPTS</a></code>
  465. (note that both these two macros must be defined, defining only <code class="computeroutput"><a class="link" href="../BOOST_CO_idm45394999656032.html" title="Macro BOOST_CONTRACT_NO_POSTCONDITIONS">BOOST_CONTRACT_NO_POSTCONDITIONS</a></code>
  466. or only <code class="computeroutput"><a class="link" href="../BOOST_CONTRACT_NO_EXCEPTS.html" title="Macro BOOST_CONTRACT_NO_EXCEPTS">BOOST_CONTRACT_NO_EXCEPTS</a></code>
  467. is not sufficient to prevent the run-time cost of old value copies).
  468. </p></td></tr>
  469. </table></div>
  470. </div>
  471. <div class="section">
  472. <div class="titlepage"><div><div><h3 class="title">
  473. <a name="boost_contract.tutorial.exception_guarantees"></a><a class="link" href="tutorial.html#boost_contract.tutorial.exception_guarantees" title="Exception Guarantees">Exception
  474. Guarantees</a>
  475. </h3></div></div></div>
  476. <p>
  477. When exception guarantees are specified, they are programmed using a functor
  478. <code class="literal"><span class="emphasis"><em>e</em></span></code> passed to <code class="computeroutput"><span class="special">.</span><span class="identifier">except</span><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>e</em></span></code><code class="computeroutput"><span class="special">)</span></code> that can be called with no parameters as
  479. in <code class="literal"><span class="emphasis"><em>e</em></span></code><code class="computeroutput"><span class="special">()</span></code>.
  480. Contracts that do not have exception guarantees simply do not call <code class="computeroutput"><span class="special">.</span><span class="identifier">except</span><span class="special">(...)</span></code>. Exception guarantees must appear after
  481. both preconditions and postconditions when these are all present (see <a class="link" href="tutorial.html#boost_contract.tutorial.preconditions" title="Preconditions">Preconditions</a> and
  482. <a class="link" href="tutorial.html#boost_contract.tutorial.postconditions" title="Postconditions">Postconditions</a>).
  483. </p>
  484. <p>
  485. C++11 lambda functions are convenient to program exception guarantees, but
  486. any other nullary functor can be used (see <a class="link" href="extras.html#boost_contract.extras.no_lambda_functions__no_c__11_" title="No Lambda Functions (No C++11)">No
  487. Lambda Functions</a>). For example, for <code class="computeroutput"><a class="link" href="../boost/contract/function.html" title="Function function">boost::contract::function</a></code>
  488. (similarly for all other contracts):
  489. </p>
  490. <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">f</span><span class="special">(...)</span> <span class="special">{</span>
  491. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">function</span><span class="special">()</span> <span class="comment">// Same for all other contracts.</span>
  492. <span class="special">...</span>
  493. <span class="special">.</span><span class="identifier">except</span><span class="special">([&amp;]</span> <span class="special">{</span> <span class="comment">// Capture by reference...</span>
  494. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(...);</span> <span class="comment">// ...but should not modify captures.</span>
  495. <span class="special">...</span>
  496. <span class="special">})</span>
  497. <span class="special">;</span>
  498. <span class="special">...</span>
  499. <span class="special">}</span>
  500. </pre>
  501. <p>
  502. The exception guarantee functor should capture all the variables that it
  503. needs to assert the exception guarantees. In general, these variables should
  504. be captured by reference and not by value (because exception guarantees need
  505. to access the value that these variables will have when the function throws,
  506. and not the value these variables had when the exception guarantee functor
  507. was first declared). Exception guarantees can also capture old values (see
  508. <a class="link" href="tutorial.html#boost_contract.tutorial.old_values" title="Old Values">Old Values</a>) but
  509. they should not access the function return value instead (because the return
  510. value is not be properly set when the function throws an exception). In any
  511. case, programmers should not write exception guarantee assertions that modify
  512. the value of the captured variables, even when those are captured by reference
  513. (see <a class="link" href="contract_programming_overview.html#boost_contract.contract_programming_overview.constant_correctness" title="Constant-Correctness">Constant-Correctness</a>).
  514. </p>
  515. <div class="note"><table border="0" summary="Note">
  516. <tr>
  517. <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td>
  518. <th align="left">Note</th>
  519. </tr>
  520. <tr><td align="left" valign="top"><p>
  521. In real production code, it might be difficult to program meaningful exception
  522. guarantees without resorting to expensive old value copies that will slow
  523. down execution. Therefore, the authors recognize that exception guarantees,
  524. even if supported by this library, might not be used often in practice
  525. (and they are not used in most of the examples listed in the rest of this
  526. documentation). In any case, these performance considerations are ultimately
  527. left to programmers and their specific application domains.
  528. </p></td></tr>
  529. </table></div>
  530. <p>
  531. Any code can be programmed in the exception guarantee functor, but it is
  532. recommended to keep this code simple using mainly assertions and if-statements
  533. (to avoid programming complex exception guarantees that might be buggy and
  534. slow to check at run-time). It is also recommended to use <code class="computeroutput"><a class="link" href="../BOOST_CONTRACT_ASSERT.html" title="Macro BOOST_CONTRACT_ASSERT">BOOST_CONTRACT_ASSERT</a></code>
  535. to program exception guarantee assertions because that enables this library
  536. to print informative error messages when the asserted conditions are evaluated
  537. to be false (note that this is not a variadic macro, see <a class="link" href="extras.html#boost_contract.extras.no_macros__and_no_variadic_macros_" title="No Macros (and No Variadic Macros)">No
  538. Macros</a>):
  539. </p>
  540. <pre class="programlisting"><span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><code class="literal"><span class="emphasis"><em>boolean-condition</em></span></code><span class="special">)</span>
  541. <span class="comment">// Or, if `boolean-condition` has commas `,` not already within parenthesis `()`...</span>
  542. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">((</span><code class="literal"><span class="emphasis"><em>boolean-condition</em></span></code><span class="special">))</span> <span class="comment">// ...use extra parenthesis (not a variadic macro).</span>
  543. </pre>
  544. <p>
  545. This library will automatically call the failure handler <code class="computeroutput"><a class="link" href="../boost/contract/except_failure.html" title="Function except_failure">boost::contract::except_failure</a></code>
  546. if any of the <code class="computeroutput"><a class="link" href="../BOOST_CONTRACT_ASSERT.html" title="Macro BOOST_CONTRACT_ASSERT">BOOST_CONTRACT_ASSERT</a></code>
  547. conditions are false or, more in general, if calling the functor specified
  548. via <code class="computeroutput"><span class="special">.</span><span class="identifier">except</span><span class="special">(...)</span></code> throws any exception. By default, this
  549. failure handler prints an error message to <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">cerr</span></code>
  550. and terminates the program calling <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">terminate</span></code>
  551. (see <a class="link" href="advanced.html#boost_contract.advanced.throw_on_failures__and__noexcept__" title="Throw on Failures (and noexcept)">Throw
  552. on Failures</a> to change the failure handler to exit the program with
  553. an error code or to take some other custom action).
  554. </p>
  555. <div class="note"><table border="0" summary="Note">
  556. <tr>
  557. <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td>
  558. <th align="left">Note</th>
  559. </tr>
  560. <tr><td align="left" valign="top"><p>
  561. While it is technically possible for programmers to specify an exception
  562. guarantee handler that throws an exception in case of an exception guarantee
  563. failure, this will force C++ to terminate the program. That is because
  564. the handler will throw an exception while there is already an active exception
  565. on the stack (the exception thrown by the function body that caused the
  566. exception guarantees to be checked in the first place). Therefore, programmers
  567. should not change the exception guarantee failure handler to throw exceptions.
  568. </p></td></tr>
  569. </table></div>
  570. </div>
  571. <div class="section">
  572. <div class="titlepage"><div><div><h3 class="title">
  573. <a name="boost_contract.tutorial.class_invariants"></a><a class="link" href="tutorial.html#boost_contract.tutorial.class_invariants" title="Class Invariants">Class Invariants</a>
  574. </h3></div></div></div>
  575. <p>
  576. Public member functions, constructors, and destructors can be programmed
  577. to also check class invariants. When class invariants are specified, they
  578. are programmed in a public <code class="computeroutput"><span class="keyword">const</span></code>
  579. function named <code class="computeroutput"><span class="identifier">invariant</span></code>
  580. taking no argument and returning <code class="computeroutput"><span class="keyword">void</span></code>.
  581. Classes that do not have invariants, simply do not declare the <code class="computeroutput"><span class="identifier">invariant</span></code> function. <a href="#ftn.boost_contract.tutorial.class_invariants.f0" class="footnote" name="boost_contract.tutorial.class_invariants.f0"><sup class="footnote">[27]</sup></a> For example:
  582. </p>
  583. <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">u</span> <span class="special">{</span>
  584. <span class="keyword">public</span><span class="special">:</span> <span class="comment">// Must be public.</span>
  585. <span class="keyword">void</span> <span class="identifier">invariant</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span> <span class="comment">// Must be const.</span>
  586. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(...);</span>
  587. <span class="special">...</span>
  588. <span class="special">}</span>
  589. <span class="special">...</span>
  590. <span class="special">};</span>
  591. </pre>
  592. <p>
  593. This member function must be <code class="computeroutput"><span class="keyword">const</span></code>
  594. because contracts should not modify the object state (see <a class="link" href="contract_programming_overview.html#boost_contract.contract_programming_overview.constant_correctness" title="Constant-Correctness">Constant-Correctness</a>).
  595. This library will generate a compile-time error if the <code class="computeroutput"><span class="keyword">const</span></code>
  596. qualifier is missing (unless <code class="computeroutput"><a class="link" href="../BOOST_CONTRACT_PERMISSIVE.html" title="Macro BOOST_CONTRACT_PERMISSIVE">BOOST_CONTRACT_PERMISSIVE</a></code>
  597. is defined).
  598. </p>
  599. <p>
  600. Any code can be programmed in the <code class="computeroutput"><span class="identifier">invariant</span></code>
  601. function, but it is recommended to keep this code simple using mainly assertions
  602. and if-statements (to avoid programming complex invariants that might be
  603. buggy and slow to check at run-time). It is also recommended to use <code class="computeroutput"><a class="link" href="../BOOST_CONTRACT_ASSERT.html" title="Macro BOOST_CONTRACT_ASSERT">BOOST_CONTRACT_ASSERT</a></code> to program
  604. class invariant assertions because that enables this library to print informative
  605. error messages when the asserted conditions are evaluated to be false (note
  606. that this is not a variadic macro, see <a class="link" href="extras.html#boost_contract.extras.no_macros__and_no_variadic_macros_" title="No Macros (and No Variadic Macros)">No
  607. Macros</a>):
  608. </p>
  609. <pre class="programlisting"><span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><code class="literal"><span class="emphasis"><em>boolean-condition</em></span></code><span class="special">)</span>
  610. <span class="comment">// Or, if `boolean-condition` has commas `,` not already within parenthesis `()`...</span>
  611. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">((</span><code class="literal"><span class="emphasis"><em>boolean-condition</em></span></code><span class="special">))</span> <span class="comment">// ...use extra parenthesis (not a variadic macro).</span>
  612. </pre>
  613. <p>
  614. This library will automatically call failure handlers <code class="computeroutput"><a class="link" href="../boost/contract/entry_invariant_failure.html" title="Function entry_invariant_failure">boost::contract::entry_invariant_failure</a></code>
  615. or <code class="computeroutput"><a class="link" href="../boost/contract/exit_invariant_failure.html" title="Function exit_invariant_failure">boost::contract::exit_invariant_failure</a></code>
  616. if any of the <code class="computeroutput"><a class="link" href="../BOOST_CONTRACT_ASSERT.html" title="Macro BOOST_CONTRACT_ASSERT">BOOST_CONTRACT_ASSERT</a></code>
  617. conditions are false or, more in general, if the <code class="computeroutput"><span class="identifier">invariant</span></code>
  618. function throws an exception when invariants are checked at function entry
  619. or exit respectively. By default, these handlers print an error message to
  620. <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">cerr</span></code> and terminate the program calling
  621. <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">terminate</span></code> (see <a class="link" href="advanced.html#boost_contract.advanced.throw_on_failures__and__noexcept__" title="Throw on Failures (and noexcept)">Throw
  622. on Failures</a> to change these failure handlers to throw exceptions,
  623. exit the program with an error code, etc.).
  624. </p>
  625. <p>
  626. See <a class="link" href="advanced.html#boost_contract.advanced.access_specifiers" title="Access Specifiers">Access Specifiers</a>
  627. to avoid making the <code class="computeroutput"><span class="identifier">invariant</span></code>
  628. member function <code class="computeroutput"><span class="keyword">public</span></code>. <a href="#ftn.boost_contract.tutorial.class_invariants.f1" class="footnote" name="boost_contract.tutorial.class_invariants.f1"><sup class="footnote">[28]</sup></a> See <code class="computeroutput"><a class="link" href="../BOOST_CO_idm45394999724496.html" title="Macro BOOST_CONTRACT_INVARIANT_FUNC">BOOST_CONTRACT_INVARIANT_FUNC</a></code>
  629. to use a name different from <code class="computeroutput"><span class="identifier">invariant</span></code>
  630. (e.g., because <code class="computeroutput"><span class="identifier">invariant</span></code>
  631. clashes with other names in user-defined classes).
  632. </p>
  633. <div class="note"><table border="0" summary="Note">
  634. <tr>
  635. <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td>
  636. <th align="left">Note</th>
  637. </tr>
  638. <tr><td align="left" valign="top"><p>
  639. Contract assertions are not checked (not even class invariants) when data
  640. members are accessed directly (this is different from Eiffel where even
  641. accessing public data members checks class invariants). Therefore, it might
  642. be best for both <code class="computeroutput"><span class="keyword">class</span></code>es and
  643. <code class="computeroutput"><span class="keyword">struct</span></code>s (and also <code class="computeroutput"><span class="keyword">union</span></code>s, see <a class="link" href="extras.html#boost_contract.extras.unions" title="Unions">Unions</a>)
  644. that have invariants to have no mutable public data members and to access
  645. data members publicly only via appropriate public functions (e.g., setters
  646. and getters) that can be programmed to check the class invariants using
  647. this library.
  648. </p></td></tr>
  649. </table></div>
  650. <p>
  651. See <a class="link" href="extras.html#boost_contract.extras.volatile_public_functions" title="Volatile Public Functions">Volatile
  652. Public Functions</a> to program invariants for classes with <code class="computeroutput"><span class="keyword">volatile</span></code> public functions.
  653. </p>
  654. <h5>
  655. <a name="boost_contract.tutorial.class_invariants.h0"></a>
  656. <span class="phrase"><a name="boost_contract.tutorial.class_invariants.static_class_invariants"></a></span><a class="link" href="tutorial.html#boost_contract.tutorial.class_invariants.static_class_invariants">Static
  657. Class Invariants</a>
  658. </h5>
  659. <p>
  660. Static public functions can be programmed to check static class invariants.
  661. When static class invariants are specified, they are programmed in a public
  662. <code class="computeroutput"><span class="keyword">static</span></code> function named <code class="computeroutput"><span class="identifier">static_invariant</span></code> taking no argument and
  663. returning <code class="computeroutput"><span class="keyword">void</span></code>. Classes that
  664. do not have static class invariants, simply do not declare the <code class="computeroutput"><span class="identifier">static_invariant</span></code> function. <a href="#ftn.boost_contract.tutorial.class_invariants.f2" class="footnote" name="boost_contract.tutorial.class_invariants.f2"><sup class="footnote">[29]</sup></a> For example:
  665. </p>
  666. <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">u</span> <span class="special">{</span>
  667. <span class="keyword">public</span><span class="special">:</span> <span class="comment">// Must be public.</span>
  668. <span class="keyword">static</span> <span class="keyword">void</span> <span class="identifier">static_invariant</span><span class="special">()</span> <span class="special">{</span> <span class="comment">// Must be static.</span>
  669. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(...);</span>
  670. <span class="special">...</span>
  671. <span class="special">}</span>
  672. <span class="special">...</span>
  673. <span class="special">};</span>
  674. </pre>
  675. <p>
  676. This member function must be <code class="computeroutput"><span class="keyword">static</span></code>
  677. (and it correctly cannot access the object <code class="computeroutput"><span class="keyword">this</span></code>).
  678. This library will generate a compile-time error if the <code class="computeroutput"><span class="keyword">static</span></code>
  679. classifier is missing (unless the <code class="computeroutput"><a class="link" href="../BOOST_CONTRACT_PERMISSIVE.html" title="Macro BOOST_CONTRACT_PERMISSIVE">BOOST_CONTRACT_PERMISSIVE</a></code>
  680. macro is defined).
  681. </p>
  682. <p>
  683. Any code can be programmed in the <code class="computeroutput"><span class="identifier">static_invariant</span></code>
  684. function, but it is recommended to keep this code simple using mainly assertions
  685. and if-statements (to avoid programming complex static invariants that might
  686. be buggy and slow to check at run-time). It is also recommended to use <code class="computeroutput"><a class="link" href="../BOOST_CONTRACT_ASSERT.html" title="Macro BOOST_CONTRACT_ASSERT">BOOST_CONTRACT_ASSERT</a></code> to program
  687. the assertions because that enables this library to print informative error
  688. messages when the asserted conditions are evaluated to be false (note that
  689. this is not a variadic macro, see <a class="link" href="extras.html#boost_contract.extras.no_macros__and_no_variadic_macros_" title="No Macros (and No Variadic Macros)">No
  690. Macros</a>):
  691. </p>
  692. <pre class="programlisting"><span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><code class="literal"><span class="emphasis"><em>boolean-condition</em></span></code><span class="special">)</span>
  693. <span class="comment">// Or, if `boolean-condition` has commas `,` not already within parenthesis `()`...</span>
  694. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">((</span><code class="literal"><span class="emphasis"><em>boolean-condition</em></span></code><span class="special">))</span> <span class="comment">// ...use extra parenthesis (not a variadic macro).</span>
  695. </pre>
  696. <p>
  697. This library will automatically call failure handlers <code class="computeroutput"><a class="link" href="../boost/contract/entry_invariant_failure.html" title="Function entry_invariant_failure">boost::contract::entry_invariant_failure</a></code>
  698. or <code class="computeroutput"><a class="link" href="../boost/contract/exit_invariant_failure.html" title="Function exit_invariant_failure">boost::contract::exit_invariant_failure</a></code>
  699. if any of the <code class="computeroutput"><a class="link" href="../BOOST_CONTRACT_ASSERT.html" title="Macro BOOST_CONTRACT_ASSERT">BOOST_CONTRACT_ASSERT</a></code>
  700. conditions are false or, more in general, if the <code class="computeroutput"><span class="identifier">static_invariant</span></code>
  701. function throws an exception when invariants are checked at function entry
  702. or exit respectively. By default, these handlers print an error message to
  703. <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">cerr</span></code> and terminate the program calling
  704. <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">terminate</span></code> (see <a class="link" href="advanced.html#boost_contract.advanced.throw_on_failures__and__noexcept__" title="Throw on Failures (and noexcept)">Throw
  705. on Failures</a> to change these failure handlers to throw exceptions,
  706. exit the program with an error code, etc.).
  707. </p>
  708. <p>
  709. See <a class="link" href="advanced.html#boost_contract.advanced.access_specifiers" title="Access Specifiers">Access Specifiers</a>
  710. to avoid making <code class="computeroutput"><span class="identifier">static_invariant</span></code>
  711. member function <code class="computeroutput"><span class="keyword">public</span></code>. <a href="#ftn.boost_contract.tutorial.class_invariants.f3" class="footnote" name="boost_contract.tutorial.class_invariants.f3"><sup class="footnote">[30]</sup></a> See <code class="computeroutput"><a class="link" href="../BOOST_CO_idm45394999714768.html" title="Macro BOOST_CONTRACT_STATIC_INVARIANT_FUNC">BOOST_CONTRACT_STATIC_INVARIANT_FUNC</a></code>
  712. to use a name different from <code class="computeroutput"><span class="identifier">static_invariant</span></code>
  713. (e.g., because <code class="computeroutput"><span class="identifier">static_invariant</span></code>
  714. clashes with other names in user-defined classes). <a href="#ftn.boost_contract.tutorial.class_invariants.f4" class="footnote" name="boost_contract.tutorial.class_invariants.f4"><sup class="footnote">[31]</sup></a>
  715. </p>
  716. </div>
  717. <div class="section">
  718. <div class="titlepage"><div><div><h3 class="title">
  719. <a name="boost_contract.tutorial.constructors"></a><a class="link" href="tutorial.html#boost_contract.tutorial.constructors" title="Constructors">Constructors</a>
  720. </h3></div></div></div>
  721. <p>
  722. Contracts for constructors are programmed using the <code class="computeroutput"><a class="link" href="../boost/contract/constructor.html" title="Function template constructor">boost::contract::constructor</a></code>
  723. function and the <code class="computeroutput"><a class="link" href="../boost/contract/constructor_precondition.html" title="Class template constructor_precondition">boost::contract::constructor_precondition</a></code>
  724. base class. For example (see <a href="../../../example/features/public.cpp" target="_top"><code class="literal">public.cpp</code></a>):
  725. </p>
  726. <p>
  727. </p>
  728. <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">unique_identifiers</span> <span class="special">:</span>
  729. <span class="keyword">private</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor_precondition</span><span class="special">&lt;</span><span class="identifier">unique_identifiers</span><span class="special">&gt;</span>
  730. <span class="special">{</span>
  731. <span class="keyword">public</span><span class="special">:</span>
  732. <span class="keyword">void</span> <span class="identifier">invariant</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  733. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">&gt;=</span> <span class="number">0</span><span class="special">);</span>
  734. <span class="special">}</span>
  735. </pre>
  736. <p>
  737. </p>
  738. <p>
  739. </p>
  740. <pre class="programlisting"><span class="keyword">public</span><span class="special">:</span>
  741. <span class="comment">// Contract for a constructor.</span>
  742. <span class="identifier">unique_identifiers</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">from</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">to</span><span class="special">)</span> <span class="special">:</span>
  743. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor_precondition</span><span class="special">&lt;</span><span class="identifier">unique_identifiers</span><span class="special">&gt;([&amp;]</span> <span class="special">{</span>
  744. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">from</span> <span class="special">&gt;=</span> <span class="number">0</span><span class="special">);</span>
  745. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">to</span> <span class="special">&gt;=</span> <span class="identifier">from</span><span class="special">);</span>
  746. <span class="special">})</span>
  747. <span class="special">{</span>
  748. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  749. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  750. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">to</span> <span class="special">-</span> <span class="identifier">from</span> <span class="special">+</span> <span class="number">1</span><span class="special">));</span>
  751. <span class="special">})</span>
  752. <span class="special">;</span>
  753. <span class="comment">// Constructor body.</span>
  754. <span class="keyword">for</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">id</span> <span class="special">=</span> <span class="identifier">from</span><span class="special">;</span> <span class="identifier">id</span> <span class="special">&lt;=</span> <span class="identifier">to</span><span class="special">;</span> <span class="special">++</span><span class="identifier">id</span><span class="special">)</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">id</span><span class="special">);</span>
  755. <span class="special">}</span>
  756. </pre>
  757. <p>
  758. </p>
  759. <p>
  760. </p>
  761. <pre class="programlisting"> <span class="comment">/* ... */</span>
  762. <span class="special">};</span>
  763. </pre>
  764. <p>
  765. </p>
  766. <p>
  767. It is not possible to specify preconditions using <code class="computeroutput"><span class="special">.</span><span class="identifier">precondition</span><span class="special">(...)</span></code>
  768. for constructors (this library will generate a compile-time error if <code class="computeroutput"><span class="special">.</span><span class="identifier">precondition</span><span class="special">(...)</span></code> is used on the object returned by <code class="computeroutput"><a class="link" href="../boost/contract/constructor.html" title="Function template constructor">boost::contract::constructor</a></code>).
  769. Constructor preconditions are specified using the <code class="computeroutput"><a class="link" href="../boost/contract/constructor_precondition.html" title="Class template constructor_precondition">boost::contract::constructor_precondition</a></code>
  770. base class instead (same considerations as the ones made in <a class="link" href="tutorial.html#boost_contract.tutorial.preconditions" title="Preconditions">Preconditions</a>
  771. apply also to the precondition functor passed to <code class="computeroutput"><a class="link" href="../boost/contract/constructor_precondition.html" title="Class template constructor_precondition">boost::contract::constructor_precondition</a></code>).
  772. Programmes should not access the object <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> from constructor preconditions (because
  773. the object does not exists yet before the constructor body is executed).
  774. <a href="#ftn.boost_contract.tutorial.constructors.f0" class="footnote" name="boost_contract.tutorial.constructors.f0"><sup class="footnote">[32]</sup></a> Constructors without preconditions simply do not explicitly initialize
  775. the <code class="computeroutput"><a class="link" href="../boost/contract/constructor_precondition.html" title="Class template constructor_precondition">boost::contract::constructor_precondition</a></code>
  776. base (because <code class="computeroutput"><a class="link" href="../boost/contract/constructor_precondition.html" title="Class template constructor_precondition">boost::contract::constructor_precondition</a></code>
  777. default constructor checks no contract). When the <code class="computeroutput"><a class="link" href="../boost/contract/constructor_precondition.html" title="Class template constructor_precondition">boost::contract::constructor_precondition</a></code>
  778. base class is used: <a href="#ftn.boost_contract.tutorial.constructors.f1" class="footnote" name="boost_contract.tutorial.constructors.f1"><sup class="footnote">[33]</sup></a>
  779. </p>
  780. <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
  781. <li class="listitem">
  782. It should be specified as the <span class="emphasis"><em>first</em></span> class in the
  783. inheritance list (so constructor preconditions are checked before initializing
  784. any other base class or data member).
  785. </li>
  786. <li class="listitem">
  787. Its inheritance access specifier should always be <code class="computeroutput"><span class="keyword">private</span></code>
  788. (so this extra base class does not alter the public inheritance tree
  789. of its derived classes).
  790. </li>
  791. <li class="listitem">
  792. It should never be declared as a <code class="computeroutput"><span class="keyword">virtual</span></code>
  793. base (because virtual bases are initialized only once across the entire
  794. inheritance hierarchy preventing preconditions of other base classes
  795. from being checked).
  796. </li>
  797. <li class="listitem">
  798. It takes the derived class as template parameter. <a href="#ftn.boost_contract.tutorial.constructors.f2" class="footnote" name="boost_contract.tutorial.constructors.f2"><sup class="footnote">[34]</sup></a>
  799. </li>
  800. </ul></div>
  801. <div class="note"><table border="0" summary="Note">
  802. <tr>
  803. <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td>
  804. <th align="left">Note</th>
  805. </tr>
  806. <tr><td align="left" valign="top"><p>
  807. A class can avoid inheriting from <code class="computeroutput"><a class="link" href="../boost/contract/constructor_precondition.html" title="Class template constructor_precondition">boost::contract::constructor_precondition</a></code>
  808. for efficiency but only when all its constructors have no preconditions.
  809. </p></td></tr>
  810. </table></div>
  811. <p>
  812. It is possible to specify postconditions for constructors (see <a class="link" href="tutorial.html#boost_contract.tutorial.postconditions" title="Postconditions">Postconditions</a>),
  813. but programmers should not access the old value of the object <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> in constructor
  814. postconditions (because the object did not exist yet before the constructor
  815. body was executed). <a href="#ftn.boost_contract.tutorial.constructors.f3" class="footnote" name="boost_contract.tutorial.constructors.f3"><sup class="footnote">[35]</sup></a> It is also possible to specify exceptions guarantees for constructors
  816. (see <a class="link" href="tutorial.html#boost_contract.tutorial.exception_guarantees" title="Exception Guarantees">Exception
  817. Guarantees</a>), but programmers should not access the object <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> or its
  818. old value in constructor exception guarantees (because the object did not
  819. exist before executing the constructor body and it was not properly constructed
  820. given the constructor body threw an exception). <a href="#ftn.boost_contract.tutorial.constructors.f4" class="footnote" name="boost_contract.tutorial.constructors.f4"><sup class="footnote">[36]</sup></a> The <code class="computeroutput"><a class="link" href="../boost/contract/constructor.html" title="Function template constructor">boost::contract::constructor</a></code>
  821. function takes <code class="computeroutput"><span class="keyword">this</span></code> as a parameter
  822. (because constructors check class invariants, see <a class="link" href="tutorial.html#boost_contract.tutorial.class_invariants" title="Class Invariants">Class
  823. Invariants</a>).
  824. </p>
  825. <p>
  826. The <code class="computeroutput"><a class="link" href="../boost/contract/constructor.html" title="Function template constructor">boost::contract::constructor</a></code>
  827. function returns an RAII object that must always be assigned to a local variable
  828. of type <code class="computeroutput"><a class="link" href="../boost/contract/check.html" title="Class check">boost::contract::check</a></code>
  829. (otherwise this library will generate a run-time error, see <code class="computeroutput"><a class="link" href="../BOOST_CO_idm45394999694064.html" title="Macro BOOST_CONTRACT_ON_MISSING_CHECK_DECL">BOOST_CONTRACT_ON_MISSING_CHECK_DECL</a></code>).
  830. Furthermore, C++11 <code class="computeroutput"><span class="keyword">auto</span></code> declarations
  831. cannot be used here and the <code class="computeroutput"><a class="link" href="../boost/contract/check.html" title="Class check">boost::contract::check</a></code>
  832. type must be explicitly specified (otherwise this library will generate a
  833. compile-time error prior C++17 and a run-time error post C++17). The constructor
  834. body is programmed right after the declaration of this RAII object.
  835. </p>
  836. <p>
  837. At construction, the <code class="computeroutput"><a class="link" href="../boost/contract/check.html" title="Class check">boost::contract::check</a></code>
  838. RAII object for constructors does the following (enclosing constructor entry):
  839. </p>
  840. <div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem">
  841. Check static class invariants, by calling <code class="literal"><span class="emphasis"><em>type-of</em></span></code><code class="computeroutput"><span class="special">(*</span><span class="keyword">this</span><span class="special">)::</span><span class="identifier">static_invariant</span><span class="special">()</span></code> (but not non-static class invariants
  842. because the object does not exist yet).
  843. </li></ol></div>
  844. <p>
  845. At destruction instead (enclosing constructor exit):
  846. </p>
  847. <div class="orderedlist"><ol class="orderedlist" type="1">
  848. <li class="listitem">
  849. Check static class invariants, by calling <code class="literal"><span class="emphasis"><em>type-of</em></span></code><code class="computeroutput"><span class="special">(*</span><span class="keyword">this</span><span class="special">)::</span><span class="identifier">static_invariant</span><span class="special">()</span></code>.
  850. </li>
  851. <li class="listitem">
  852. If the constructor body did not throw an exception:
  853. <div class="orderedlist"><ol class="orderedlist" type="a">
  854. <li class="listitem">
  855. Check non-static class invariants, by calling <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">invariant</span><span class="special">()</span></code>.
  856. </li>
  857. <li class="listitem">
  858. Check postconditions, by calling the nullary functor <code class="literal"><span class="emphasis"><em>s</em></span></code><code class="computeroutput"><span class="special">()</span></code> passed to <code class="computeroutput"><span class="special">.</span><span class="identifier">postcondition</span><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>s</em></span></code><code class="computeroutput"><span class="special">)</span></code>.
  859. </li>
  860. </ol></div>
  861. </li>
  862. <li class="listitem">
  863. Else:
  864. <div class="orderedlist"><ol class="orderedlist" type="a"><li class="listitem">
  865. Check exception guarantees, by calling the nullary functor <code class="literal"><span class="emphasis"><em>e</em></span></code><code class="computeroutput"><span class="special">()</span></code> passed to <code class="computeroutput"><span class="special">.</span><span class="identifier">except</span><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>e</em></span></code><code class="computeroutput"><span class="special">)</span></code>.
  866. </li></ol></div>
  867. </li>
  868. </ol></div>
  869. <p>
  870. This together with C++ object construction mechanism of base classes and
  871. the use of <code class="computeroutput"><a class="link" href="../boost/contract/constructor_precondition.html" title="Class template constructor_precondition">boost::contract::constructor_precondition</a></code>
  872. ensures that the constructor contracts are correctly checked at run-time
  873. (see <a class="link" href="contract_programming_overview.html#boost_contract.contract_programming_overview.constructor_calls" title="Constructor Calls">Constructor
  874. Calls</a>).
  875. </p>
  876. <div class="note"><table border="0" summary="Note">
  877. <tr>
  878. <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td>
  879. <th align="left">Note</th>
  880. </tr>
  881. <tr><td align="left" valign="top">
  882. <p>
  883. A constructor can avoid calling <code class="computeroutput"><a class="link" href="../boost/contract/constructor.html" title="Function template constructor">boost::contract::constructor</a></code>
  884. for efficiency but only when it has no postconditions, no exception guarantees,
  885. and its class has no invariants (even if <code class="computeroutput"><a class="link" href="../boost/contract/constructor.html" title="Function template constructor">boost::contract::constructor</a></code>
  886. is not used by a derived class, contracts of base class constructors will
  887. still be correctly checked by C++ object construction mechanism).
  888. </p>
  889. <p>
  890. The default constructor and copy constructor automatically generated by
  891. C++ will not check contracts. Therefore, unless these constructors are
  892. not public or they have no preconditions, no postconditions, no exception
  893. guarantees, and their class has no invariants, programmers should manually
  894. define them using <code class="computeroutput"><a class="link" href="../boost/contract/constructor.html" title="Function template constructor">boost::contract::constructor</a></code>
  895. and <code class="computeroutput"><a class="link" href="../boost/contract/constructor_precondition.html" title="Class template constructor_precondition">boost::contract::constructor_precondition</a></code>.
  896. Similar considerations apply to all other constructors automatically generated
  897. by C++ (e.g., the move constructor).
  898. </p>
  899. </td></tr>
  900. </table></div>
  901. <h5>
  902. <a name="boost_contract.tutorial.constructors.h0"></a>
  903. <span class="phrase"><a name="boost_contract.tutorial.constructors.private_and_protected_constructors"></a></span><a class="link" href="tutorial.html#boost_contract.tutorial.constructors.private_and_protected_constructors">Private
  904. and Protected Constructors</a>
  905. </h5>
  906. <p>
  907. Private and protected constructors can omit <code class="computeroutput"><a class="link" href="../boost/contract/constructor.html" title="Function template constructor">boost::contract::constructor</a></code>
  908. (because they are not part of the public interface of the class so they are
  909. not required to check class invariants, see <a class="link" href="contract_programming_overview.html#boost_contract.contract_programming_overview.constructor_calls" title="Constructor Calls">Constructor
  910. Calls</a>). They could still use <code class="computeroutput"><a class="link" href="../boost/contract/constructor_precondition.html" title="Class template constructor_precondition">boost::contract::constructor_precondition</a></code>
  911. to check preconditions before member initializations, and even use <code class="computeroutput"><a class="link" href="../boost/contract/function.html" title="Function function">boost::contract::function</a></code>
  912. (but not <code class="computeroutput"><a class="link" href="../boost/contract/constructor.html" title="Function template constructor">boost::contract::constructor</a></code>)
  913. to only check postconditions and exception guarantees without checking class
  914. invariants and without calling <code class="computeroutput"><span class="special">.</span><span class="identifier">precondition</span><span class="special">(...)</span></code>
  915. (see <a class="link" href="advanced.html#boost_contract.advanced.private_and_protected_functions" title="Private and Protected Functions">Private
  916. and Protected Functions</a>). For example:
  917. </p>
  918. <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">u</span> <span class="special">:</span> <span class="keyword">private</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor_precondition</span><span class="special">&lt;</span><span class="identifier">u</span><span class="special">&gt;</span> <span class="special">{</span>
  919. <span class="keyword">protected</span><span class="special">:</span>
  920. <span class="comment">// Contract for a protected constructor (same for private constructors).</span>
  921. <span class="identifier">u</span><span class="special">()</span> <span class="special">:</span> <span class="comment">// Still use this base class to check constructor preconditions.</span>
  922. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor_precondition</span><span class="special">&lt;</span><span class="identifier">u</span><span class="special">&gt;([&amp;]</span> <span class="special">{</span>
  923. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(...);</span>
  924. <span class="special">...</span>
  925. <span class="special">})</span>
  926. <span class="special">{</span>
  927. <span class="comment">// Following will correctly not check class invariants.</span>
  928. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">function</span><span class="special">()</span>
  929. <span class="comment">// Do not use `.precondition(...)` here.</span>
  930. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  931. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(...);</span>
  932. <span class="special">...</span>
  933. <span class="special">})</span>
  934. <span class="special">.</span><span class="identifier">except</span><span class="special">([&amp;]</span> <span class="special">{</span>
  935. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(...);</span>
  936. <span class="special">...</span>
  937. <span class="special">})</span>
  938. <span class="special">;</span>
  939. <span class="special">...</span> <span class="comment">// Constructor body.</span>
  940. <span class="special">}</span>
  941. <span class="special">...</span>
  942. <span class="special">};</span>
  943. </pre>
  944. </div>
  945. <div class="section">
  946. <div class="titlepage"><div><div><h3 class="title">
  947. <a name="boost_contract.tutorial.destructors"></a><a class="link" href="tutorial.html#boost_contract.tutorial.destructors" title="Destructors">Destructors</a>
  948. </h3></div></div></div>
  949. <p>
  950. Contracts for destructors are programmed using <code class="computeroutput"><a class="link" href="../boost/contract/destructor.html" title="Function template destructor">boost::contract::destructor</a></code>.
  951. For example (see <a href="../../../example/features/public.cpp" target="_top"><code class="literal">public.cpp</code></a>):
  952. </p>
  953. <p>
  954. </p>
  955. <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">unique_identifiers</span> <span class="special">:</span>
  956. <span class="keyword">private</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor_precondition</span><span class="special">&lt;</span><span class="identifier">unique_identifiers</span><span class="special">&gt;</span>
  957. <span class="special">{</span>
  958. <span class="keyword">public</span><span class="special">:</span>
  959. <span class="keyword">void</span> <span class="identifier">invariant</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  960. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">&gt;=</span> <span class="number">0</span><span class="special">);</span>
  961. <span class="special">}</span>
  962. </pre>
  963. <p>
  964. </p>
  965. <p>
  966. </p>
  967. <pre class="programlisting"><span class="keyword">public</span><span class="special">:</span>
  968. <span class="comment">// Contract for a destructor.</span>
  969. <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">unique_identifiers</span><span class="special">()</span> <span class="special">{</span>
  970. <span class="comment">// Following contract checks class invariants.</span>
  971. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">destructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  972. <span class="comment">// Destructor body here... (do nothing in this example).</span>
  973. <span class="special">}</span>
  974. </pre>
  975. <p>
  976. </p>
  977. <p>
  978. </p>
  979. <pre class="programlisting"> <span class="comment">/* ... */</span>
  980. <span class="special">};</span>
  981. </pre>
  982. <p>
  983. </p>
  984. <p>
  985. It is not possible to specify preconditions for destructors (this library
  986. will generate a compile-time error if <code class="computeroutput"><span class="special">.</span><span class="identifier">precondition</span><span class="special">(...)</span></code>
  987. is used here and that is because destructors can be called at any time after
  988. construction so they have no precondition). It is possible to specify postconditions
  989. for destructors (see <a class="link" href="tutorial.html#boost_contract.tutorial.postconditions" title="Postconditions">Postconditions</a>,
  990. and also <a class="link" href="tutorial.html#boost_contract.tutorial.static_public_functions" title="Static Public Functions">Static
  991. Public Functions</a> for an example), but programmers should not access
  992. the object <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
  993. in destructor postconditions (because the object no longer exists after the
  994. destructor body has been executed). <a href="#ftn.boost_contract.tutorial.destructors.f0" class="footnote" name="boost_contract.tutorial.destructors.f0"><sup class="footnote">[37]</sup></a> It is also possible to specify exceptions guarantees for destructors
  995. (see <a class="link" href="tutorial.html#boost_contract.tutorial.exception_guarantees" title="Exception Guarantees">Exception
  996. Guarantees</a>, even if destructors should usually be programmed to not
  997. throw exceptions in C++, in fact destructors are implicitly declared <code class="computeroutput"><span class="keyword">noexcept</span></code> since C++11). <a href="#ftn.boost_contract.tutorial.destructors.f1" class="footnote" name="boost_contract.tutorial.destructors.f1"><sup class="footnote">[38]</sup></a> The <code class="computeroutput"><a class="link" href="../boost/contract/destructor.html" title="Function template destructor">boost::contract::destructor</a></code>
  998. function takes <code class="computeroutput"><span class="keyword">this</span></code> as a parameter
  999. (because destructors check class invariants, see <a class="link" href="tutorial.html#boost_contract.tutorial.class_invariants" title="Class Invariants">Class
  1000. Invariants</a>).
  1001. </p>
  1002. <p>
  1003. The <code class="computeroutput"><a class="link" href="../boost/contract/destructor.html" title="Function template destructor">boost::contract::destructor</a></code>
  1004. function returns an RAII object that must always be assigned to a local variable
  1005. of type <code class="computeroutput"><a class="link" href="../boost/contract/check.html" title="Class check">boost::contract::check</a></code>
  1006. (otherwise this library will generate a run-time error, see <code class="computeroutput"><a class="link" href="../BOOST_CO_idm45394999694064.html" title="Macro BOOST_CONTRACT_ON_MISSING_CHECK_DECL">BOOST_CONTRACT_ON_MISSING_CHECK_DECL</a></code>).
  1007. Furthermore, C++11 <code class="computeroutput"><span class="keyword">auto</span></code> declarations
  1008. cannot be used here and the <code class="computeroutput"><a class="link" href="../boost/contract/check.html" title="Class check">boost::contract::check</a></code>
  1009. type must be explicitly specified (otherwise this library will generate a
  1010. compile-time error prior C++17 and a run-time error post C++17). The destructor
  1011. body is programmed right after the declaration of this RAII object.
  1012. </p>
  1013. <p>
  1014. At construction, the <code class="computeroutput"><a class="link" href="../boost/contract/check.html" title="Class check">boost::contract::check</a></code>
  1015. RAII object for destructors does the following (enclosing destructor entry):
  1016. </p>
  1017. <div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem">
  1018. Check static and non-static class invariants, by calling <span class="emphasis"><em><code class="literal">type-of</code></em></span><code class="computeroutput"><span class="special">(*</span><span class="keyword">this</span><span class="special">)::</span><span class="identifier">static_invariant</span><span class="special">()</span></code> <a class="link" href="contract_programming_overview.html#and_anchor"><code class="literal"><span class="emphasis"><em>AND</em></span></code></a>
  1019. <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">invariant</span><span class="special">()</span></code>.
  1020. </li></ol></div>
  1021. <p>
  1022. At destruction instead (enclosing destructor exit):
  1023. </p>
  1024. <div class="orderedlist"><ol class="orderedlist" type="1">
  1025. <li class="listitem">
  1026. Check static class invariants, by calling <code class="literal"><span class="emphasis"><em>type-of</em></span></code><code class="computeroutput"><span class="special">(*</span><span class="keyword">this</span><span class="special">)::</span><span class="identifier">static_invariant</span><span class="special">()</span></code>.
  1027. </li>
  1028. <li class="listitem">
  1029. If the destructor body did not throw an exception:
  1030. <div class="orderedlist"><ol class="orderedlist" type="a"><li class="listitem">
  1031. Check postconditions, by calling the nullay functor <code class="literal"><span class="emphasis"><em>s</em></span></code><code class="computeroutput"><span class="special">()</span></code> passed to <code class="computeroutput"><span class="special">.</span><span class="identifier">postcondition</span><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>s</em></span></code><code class="computeroutput"><span class="special">)</span></code>.
  1032. </li></ol></div>
  1033. </li>
  1034. <li class="listitem">
  1035. Else (even if destructors should generally be programmed not to throw
  1036. in C++):
  1037. <div class="orderedlist"><ol class="orderedlist" type="a">
  1038. <li class="listitem">
  1039. Check non-static class invariants, by calling <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">invariant</span><span class="special">()</span></code> (because the object was not successfully
  1040. destructed).
  1041. </li>
  1042. <li class="listitem">
  1043. Check exception guarantees, by calling the nullary functor <code class="literal"><span class="emphasis"><em>e</em></span></code><code class="computeroutput"><span class="special">()</span></code> passed to <code class="computeroutput"><span class="special">.</span><span class="identifier">except</span><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>e</em></span></code><code class="computeroutput"><span class="special">)</span></code>.
  1044. </li>
  1045. </ol></div>
  1046. </li>
  1047. </ol></div>
  1048. <p>
  1049. This together with C++ object destruction mechanism of base classes ensures
  1050. that destructor contracts are correctly checked at run-time (see <a class="link" href="contract_programming_overview.html#boost_contract.contract_programming_overview.destructor_calls" title="Destructor Calls">Destructor
  1051. Calls</a>).
  1052. </p>
  1053. <div class="note"><table border="0" summary="Note">
  1054. <tr>
  1055. <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td>
  1056. <th align="left">Note</th>
  1057. </tr>
  1058. <tr><td align="left" valign="top">
  1059. <p>
  1060. A destructor can avoid calling <code class="computeroutput"><a class="link" href="../boost/contract/destructor.html" title="Function template destructor">boost::contract::destructor</a></code>
  1061. for efficiency but only when it has no postconditions, no exception guarantees,
  1062. and its class has no invariants (even if <code class="computeroutput"><a class="link" href="../boost/contract/destructor.html" title="Function template destructor">boost::contract::destructor</a></code>
  1063. is not used by a derived class, contracts of base class destructors will
  1064. still be correctly checked by C++ object destruction mechanism).
  1065. </p>
  1066. <p>
  1067. The default destructor automatically generated by C++ will not check contracts.
  1068. Therefore, unless the destructor is not public or it has no postconditions,
  1069. no exception guarantees, and its class has no invariants, programmers should
  1070. manually define it using <code class="computeroutput"><a class="link" href="../boost/contract/destructor.html" title="Function template destructor">boost::contract::destructor</a></code>.
  1071. </p>
  1072. </td></tr>
  1073. </table></div>
  1074. <h5>
  1075. <a name="boost_contract.tutorial.destructors.h0"></a>
  1076. <span class="phrase"><a name="boost_contract.tutorial.destructors.private_and_protected_destructors"></a></span><a class="link" href="tutorial.html#boost_contract.tutorial.destructors.private_and_protected_destructors">Private
  1077. and Protected Destructors</a>
  1078. </h5>
  1079. <p>
  1080. Private and protected destructors can omit <code class="computeroutput"><a class="link" href="../boost/contract/destructor.html" title="Function template destructor">boost::contract::destructor</a></code>
  1081. (because they are not part of the public interface of the class so they are
  1082. not required to check class invariants, see <a class="link" href="contract_programming_overview.html#boost_contract.contract_programming_overview.destructor_calls" title="Destructor Calls">Destructor
  1083. Calls</a>). They could use <code class="computeroutput"><a class="link" href="../boost/contract/function.html" title="Function function">boost::contract::function</a></code>
  1084. (but not <code class="computeroutput"><a class="link" href="../boost/contract/destructor.html" title="Function template destructor">boost::contract::destructor</a></code>)
  1085. to only check postconditions and exception guarantees without checking class
  1086. invariants and without calling <code class="computeroutput"><span class="special">.</span><span class="identifier">precondition</span><span class="special">(...)</span></code>
  1087. (see <a class="link" href="advanced.html#boost_contract.advanced.private_and_protected_functions" title="Private and Protected Functions">Private
  1088. and Protected Functions</a>). For example:
  1089. </p>
  1090. <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">u</span> <span class="special">{</span>
  1091. <span class="keyword">protected</span><span class="special">:</span>
  1092. <span class="comment">// Contract for a protected destructor (same for private destructors).</span>
  1093. <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">u</span><span class="special">()</span> <span class="special">{</span>
  1094. <span class="comment">// Following will correctly not check class invariants.</span>
  1095. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">function</span><span class="special">()</span>
  1096. <span class="comment">// Do not use `.precondition(...)` here.</span>
  1097. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  1098. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(...);</span>
  1099. <span class="special">...</span>
  1100. <span class="special">})</span>
  1101. <span class="comment">// Could use `.except(...)` here in rare cases of destructors declared to throw.</span>
  1102. <span class="special">;</span>
  1103. <span class="special">...</span> <span class="comment">// Destructor body.</span>
  1104. <span class="special">}</span>
  1105. <span class="special">...</span>
  1106. <span class="special">};</span>
  1107. </pre>
  1108. </div>
  1109. <div class="section">
  1110. <div class="titlepage"><div><div><h3 class="title">
  1111. <a name="boost_contract.tutorial.public_functions"></a><a class="link" href="tutorial.html#boost_contract.tutorial.public_functions" title="Public Functions">Public Functions</a>
  1112. </h3></div></div></div>
  1113. <p>
  1114. Contracts for public functions are programmed using <code class="computeroutput"><a class="link" href="../boost/contract/public_f_idm45394998885120.html" title="Function template public_function">boost::contract::public_function</a></code>.
  1115. In this section, let's consider public functions that are not static, not
  1116. virtual, and do not override any function from base classes. For example
  1117. (see <a href="../../../example/features/public.cpp" target="_top"><code class="literal">public.cpp</code></a>):
  1118. </p>
  1119. <p>
  1120. </p>
  1121. <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">unique_identifiers</span> <span class="special">:</span>
  1122. <span class="keyword">private</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor_precondition</span><span class="special">&lt;</span><span class="identifier">unique_identifiers</span><span class="special">&gt;</span>
  1123. <span class="special">{</span>
  1124. <span class="keyword">public</span><span class="special">:</span>
  1125. <span class="keyword">void</span> <span class="identifier">invariant</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  1126. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">&gt;=</span> <span class="number">0</span><span class="special">);</span>
  1127. <span class="special">}</span>
  1128. </pre>
  1129. <p>
  1130. </p>
  1131. <p>
  1132. </p>
  1133. <pre class="programlisting"><span class="keyword">public</span><span class="special">:</span>
  1134. <span class="comment">// Contract for a public function (but no static, virtual, or override).</span>
  1135. <span class="keyword">bool</span> <span class="identifier">find</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">id</span><span class="special">)</span> <span class="keyword">const</span> <span class="special">{</span>
  1136. <span class="keyword">bool</span> <span class="identifier">result</span><span class="special">;</span>
  1137. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  1138. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  1139. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">id</span> <span class="special">&gt;=</span> <span class="number">0</span><span class="special">);</span>
  1140. <span class="special">})</span>
  1141. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  1142. <span class="keyword">if</span><span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">)</span> <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(!</span><span class="identifier">result</span><span class="special">);</span>
  1143. <span class="special">})</span>
  1144. <span class="special">;</span>
  1145. <span class="comment">// Function body.</span>
  1146. <span class="keyword">return</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">find</span><span class="special">(</span><span class="identifier">vect_</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">id</span><span class="special">)</span> <span class="special">!=</span>
  1147. <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">end</span><span class="special">();</span>
  1148. <span class="special">}</span>
  1149. </pre>
  1150. <p>
  1151. </p>
  1152. <p>
  1153. </p>
  1154. <pre class="programlisting"> <span class="comment">/* ... */</span>
  1155. <span class="special">};</span>
  1156. </pre>
  1157. <p>
  1158. </p>
  1159. <p>
  1160. It is possible to specify preconditions, postconditions, and exception guarantees
  1161. for public functions (see <a class="link" href="tutorial.html#boost_contract.tutorial.preconditions" title="Preconditions">Preconditions</a>,
  1162. <a class="link" href="tutorial.html#boost_contract.tutorial.postconditions" title="Postconditions">Postconditions</a>,
  1163. and <a class="link" href="tutorial.html#boost_contract.tutorial.exception_guarantees" title="Exception Guarantees">Exception
  1164. Guarantees</a>). When called from non-static public functions, the <code class="computeroutput"><a class="link" href="../boost/contract/public_f_idm45394998885120.html" title="Function template public_function">boost::contract::public_function</a></code>
  1165. function takes <code class="computeroutput"><span class="keyword">this</span></code> as a parameter
  1166. (because public functions check class invariants, see <a class="link" href="tutorial.html#boost_contract.tutorial.class_invariants" title="Class Invariants">Class
  1167. Invariants</a>).
  1168. </p>
  1169. <p>
  1170. The <code class="computeroutput"><a class="link" href="../boost/contract/public_f_idm45394998885120.html" title="Function template public_function">boost::contract::public_function</a></code>
  1171. function returns an RAII object that must always be assigned to a local variable
  1172. of type <code class="computeroutput"><a class="link" href="../boost/contract/check.html" title="Class check">boost::contract::check</a></code>
  1173. (otherwise this library will generate a run-time error, see <code class="computeroutput"><a class="link" href="../BOOST_CO_idm45394999694064.html" title="Macro BOOST_CONTRACT_ON_MISSING_CHECK_DECL">BOOST_CONTRACT_ON_MISSING_CHECK_DECL</a></code>).
  1174. Furthermore, C++11 <code class="computeroutput"><span class="keyword">auto</span></code> declarations
  1175. cannot be used here and the <code class="computeroutput"><a class="link" href="../boost/contract/check.html" title="Class check">boost::contract::check</a></code>
  1176. type must be explicitly specified (otherwise this library will generate a
  1177. compile-time error prior C++17 and a run-time error post C++17). The public
  1178. function body is programmed right after the declaration of this RAII object.
  1179. </p>
  1180. <p>
  1181. At construction, the <code class="computeroutput"><a class="link" href="../boost/contract/check.html" title="Class check">boost::contract::check</a></code>
  1182. RAII object for public functions does the following (enclosing public function
  1183. entry):
  1184. </p>
  1185. <div class="orderedlist"><ol class="orderedlist" type="1">
  1186. <li class="listitem">
  1187. Check static and non-static class invariants, by calling <code class="literal"><span class="emphasis"><em>type-of</em></span></code><code class="computeroutput"><span class="special">(*</span><span class="keyword">this</span><span class="special">)::</span><span class="identifier">static_invariant</span><span class="special">()</span></code> <a class="link" href="contract_programming_overview.html#and_anchor"><code class="literal"><span class="emphasis"><em>AND</em></span></code></a>
  1188. <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">invariant</span><span class="special">()</span></code>.
  1189. </li>
  1190. <li class="listitem">
  1191. Check preconditions, by calling the nullary functor <code class="literal"><span class="emphasis"><em>r</em></span></code><code class="computeroutput"><span class="special">()</span></code> passed to <code class="computeroutput"><span class="special">.</span><span class="identifier">precondition</span><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>r</em></span></code><code class="computeroutput"><span class="special">)</span></code>.
  1192. </li>
  1193. </ol></div>
  1194. <p>
  1195. At destruction instead (enclosing public function exit):
  1196. </p>
  1197. <div class="orderedlist"><ol class="orderedlist" type="1">
  1198. <li class="listitem">
  1199. Check static and non-static class invariants, by calling <code class="literal"><span class="emphasis"><em>type-of</em></span></code><code class="computeroutput"><span class="special">(*</span><span class="keyword">this</span><span class="special">)::</span><span class="identifier">static_invariant</span><span class="special">()</span></code> <a class="link" href="contract_programming_overview.html#and_anchor"><code class="literal"><span class="emphasis"><em>AND</em></span></code></a>
  1200. <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">invariant</span><span class="special">()</span></code>
  1201. (even if the function body threw an exception).
  1202. </li>
  1203. <li class="listitem">
  1204. If the function body did not throw an exception:
  1205. <div class="orderedlist"><ol class="orderedlist" type="a"><li class="listitem">
  1206. Check postconditions, by calling the nullary functor <code class="literal"><span class="emphasis"><em>s</em></span></code><code class="computeroutput"><span class="special">()</span></code> passed to <code class="computeroutput"><span class="special">.</span><span class="identifier">postcondition</span><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>s</em></span></code><code class="computeroutput"><span class="special">)</span></code>.
  1207. </li></ol></div>
  1208. </li>
  1209. <li class="listitem">
  1210. Else:
  1211. <div class="orderedlist"><ol class="orderedlist" type="a"><li class="listitem">
  1212. Check exception guarantees, by calling the nullary functor <code class="literal"><span class="emphasis"><em>e</em></span></code><code class="computeroutput"><span class="special">()</span></code> passed to <code class="computeroutput"><span class="special">.</span><span class="identifier">except</span><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>e</em></span></code><code class="computeroutput"><span class="special">)</span></code>.
  1213. </li></ol></div>
  1214. </li>
  1215. </ol></div>
  1216. <p>
  1217. This ensures that public function contracts are correctly checked at run-time
  1218. (see <a class="link" href="contract_programming_overview.html#boost_contract.contract_programming_overview.public_function_calls" title="Public Function Calls">Public
  1219. Function Calls</a>).
  1220. </p>
  1221. <div class="note"><table border="0" summary="Note">
  1222. <tr>
  1223. <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td>
  1224. <th align="left">Note</th>
  1225. </tr>
  1226. <tr><td align="left" valign="top">
  1227. <p>
  1228. A public function can avoid calling <code class="computeroutput"><a class="link" href="../boost/contract/public_f_idm45394998885120.html" title="Function template public_function">boost::contract::public_function</a></code>
  1229. for efficiency but only when it has no preconditions, no postconditions,
  1230. no exception guarantees, it is not virtual, it does not override any virtual
  1231. function, and its class has no invariants.
  1232. </p>
  1233. <p>
  1234. The default copy assignment operator automatically generated by C++ will
  1235. not check contracts. Therefore, unless this operator is not public or it
  1236. has no preconditions, no postconditions, no exception guarantees, and its
  1237. class has no invariants, programmers should manually define it using <code class="computeroutput"><a class="link" href="../boost/contract/public_f_idm45394998885120.html" title="Function template public_function">boost::contract::public_function</a></code>.
  1238. Similar considerations apply to all other operators automatically generated
  1239. by C++ (e.g., the move operator).
  1240. </p>
  1241. </td></tr>
  1242. </table></div>
  1243. </div>
  1244. <div class="section">
  1245. <div class="titlepage"><div><div><h3 class="title">
  1246. <a name="boost_contract.tutorial.virtual_public_functions"></a><a class="link" href="tutorial.html#boost_contract.tutorial.virtual_public_functions" title="Virtual Public Functions">Virtual
  1247. Public Functions</a>
  1248. </h3></div></div></div>
  1249. <p>
  1250. Contracts for public functions are programmed using <code class="computeroutput"><a class="link" href="../boost/contract/public_f_idm45394998885120.html" title="Function template public_function">boost::contract::public_function</a></code>.
  1251. In this section, let's consider public functions that are virtual but that
  1252. do not override any function from base classes. For example (see <a href="../../../example/features/public.cpp" target="_top"><code class="literal">public.cpp</code></a>):
  1253. </p>
  1254. <p>
  1255. </p>
  1256. <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">unique_identifiers</span> <span class="special">:</span>
  1257. <span class="keyword">private</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor_precondition</span><span class="special">&lt;</span><span class="identifier">unique_identifiers</span><span class="special">&gt;</span>
  1258. <span class="special">{</span>
  1259. <span class="keyword">public</span><span class="special">:</span>
  1260. <span class="keyword">void</span> <span class="identifier">invariant</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  1261. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">&gt;=</span> <span class="number">0</span><span class="special">);</span>
  1262. <span class="special">}</span>
  1263. </pre>
  1264. <p>
  1265. </p>
  1266. <p>
  1267. </p>
  1268. <pre class="programlisting"><span class="keyword">public</span><span class="special">:</span>
  1269. <span class="comment">// Contract for a public virtual function (but no override).</span>
  1270. <span class="keyword">virtual</span> <span class="keyword">int</span> <span class="identifier">push_back</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">id</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">0</span><span class="special">)</span> <span class="special">{</span> <span class="comment">// Extra `v`.</span>
  1271. <span class="keyword">int</span> <span class="identifier">result</span><span class="special">;</span>
  1272. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="keyword">bool</span><span class="special">&gt;</span> <span class="identifier">old_find</span> <span class="special">=</span>
  1273. <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">v</span><span class="special">,</span> <span class="identifier">find</span><span class="special">(</span><span class="identifier">id</span><span class="special">));</span> <span class="comment">// Pass `v`.</span>
  1274. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">old_size</span> <span class="special">=</span>
  1275. <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">v</span><span class="special">,</span> <span class="identifier">size</span><span class="special">());</span> <span class="comment">// Pass `v`.</span>
  1276. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span>
  1277. <span class="identifier">v</span><span class="special">,</span> <span class="identifier">result</span><span class="special">,</span> <span class="keyword">this</span><span class="special">)</span> <span class="comment">// Pass `v` and `result`.</span>
  1278. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  1279. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">id</span> <span class="special">&gt;=</span> <span class="number">0</span><span class="special">);</span>
  1280. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(!</span><span class="identifier">find</span><span class="special">(</span><span class="identifier">id</span><span class="special">));</span> <span class="comment">// ID cannot be already present.</span>
  1281. <span class="special">})</span>
  1282. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">(</span><span class="keyword">int</span> <span class="keyword">const</span> <span class="identifier">result</span><span class="special">)</span> <span class="special">{</span>
  1283. <span class="keyword">if</span><span class="special">(!*</span><span class="identifier">old_find</span><span class="special">)</span> <span class="special">{</span>
  1284. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">find</span><span class="special">(</span><span class="identifier">id</span><span class="special">));</span>
  1285. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="special">*</span><span class="identifier">old_size</span> <span class="special">+</span> <span class="number">1</span><span class="special">);</span>
  1286. <span class="special">}</span>
  1287. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">result</span> <span class="special">==</span> <span class="identifier">id</span><span class="special">);</span>
  1288. <span class="special">})</span>
  1289. <span class="special">;</span>
  1290. <span class="comment">// Function body.</span>
  1291. <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">id</span><span class="special">);</span>
  1292. <span class="keyword">return</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">id</span><span class="special">;</span>
  1293. <span class="special">}</span>
  1294. </pre>
  1295. <p>
  1296. </p>
  1297. <p>
  1298. </p>
  1299. <pre class="programlisting"> <span class="comment">/* ... */</span>
  1300. <span class="special">};</span>
  1301. </pre>
  1302. <p>
  1303. </p>
  1304. <p>
  1305. Virtual public functions must declare an extra trailing parameter of type
  1306. <code class="computeroutput"><a class="link" href="../boost/contract/virtual_.html" title="Class virtual_">boost::contract::virtual_</a></code><code class="computeroutput"><span class="special">*</span></code> with default value <code class="computeroutput"><span class="number">0</span></code>
  1307. (i.e., <code class="computeroutput"><span class="keyword">nullptr</span></code>). <a href="#ftn.boost_contract.tutorial.virtual_public_functions.f0" class="footnote" name="boost_contract.tutorial.virtual_public_functions.f0"><sup class="footnote">[39]</sup></a> This extra parameter is the last parameter and it has a default
  1308. value so it does not alter the calling interface of the virtual function
  1309. (callers will rarely, if ever, have to explicitly deal with this extra parameter
  1310. a part from when manipulating the virtual function type directly for function
  1311. pointer type-casting, etc.). Programmers must pass the extra virtual parameter
  1312. as the very first argument to all <code class="computeroutput"><a class="link" href="../BOOST_CONTRACT_OLDOF.html" title="Macro BOOST_CONTRACT_OLDOF">BOOST_CONTRACT_OLDOF</a></code>
  1313. and <code class="computeroutput"><a class="link" href="../boost/contract/public_f_idm45394998885120.html" title="Function template public_function">boost::contract::public_function</a></code>
  1314. calls in the virtual public function definition. <a href="#ftn.boost_contract.tutorial.virtual_public_functions.f1" class="footnote" name="boost_contract.tutorial.virtual_public_functions.f1"><sup class="footnote">[40]</sup></a>
  1315. </p>
  1316. <p>
  1317. When called from virtual public functions, the <code class="computeroutput"><a class="link" href="../boost/contract/public_f_idm45394998885120.html" title="Function template public_function">boost::contract::public_function</a></code>
  1318. function takes <code class="computeroutput"><span class="keyword">this</span></code> as a parameter
  1319. (because public functions check class invariants, see <a class="link" href="tutorial.html#boost_contract.tutorial.class_invariants" title="Class Invariants">Class
  1320. Invariants</a>). For virtual public functions returning <code class="computeroutput"><span class="keyword">void</span></code>:
  1321. </p>
  1322. <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">u</span> <span class="special">{</span>
  1323. <span class="keyword">public</span><span class="special">:</span>
  1324. <span class="comment">// A void virtual public function (that does not override).</span>
  1325. <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">f</span><span class="special">(</span><span class="identifier">t_1</span> <span class="identifier">a_1</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">t_n</span> <span class="identifier">a_n</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">0</span><span class="special">)</span> <span class="special">{</span>
  1326. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span>
  1327. <span class="identifier">v</span><span class="special">,</span> <span class="keyword">this</span><span class="special">)</span> <span class="comment">// No result parameter...</span>
  1328. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span> <span class="special">...</span> <span class="special">})</span>
  1329. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span> <span class="special">...</span> <span class="special">})</span> <span class="comment">// ...so nullary functor.</span>
  1330. <span class="special">.</span><span class="identifier">except</span><span class="special">([&amp;]</span> <span class="special">{</span> <span class="special">...</span> <span class="special">})</span>
  1331. <span class="special">;</span>
  1332. <span class="special">...</span>
  1333. <span class="special">}</span>
  1334. <span class="special">...</span>
  1335. <span class="special">}</span>
  1336. </pre>
  1337. <p>
  1338. For virtual public functions not returning <code class="computeroutput"><span class="keyword">void</span></code>,
  1339. programmers must also pass a reference to the function return value as the
  1340. second argument to <code class="computeroutput"><a class="link" href="../boost/contract/public_f_idm45394998885120.html" title="Function template public_function">boost::contract::public_function</a></code>.
  1341. In this case, the library will pass this return value reference to the postcondition
  1342. functor that must therefore take one single argument matching the return
  1343. type, otherwise this library will generate a compile-time error (the functor
  1344. parameter can be a constant reference <code class="computeroutput"><span class="keyword">const</span><span class="special">&amp;</span></code> to avoid extra copies of the return
  1345. value): <a href="#ftn.boost_contract.tutorial.virtual_public_functions.f2" class="footnote" name="boost_contract.tutorial.virtual_public_functions.f2"><sup class="footnote">[41]</sup></a>
  1346. </p>
  1347. <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">u</span> <span class="special">{</span>
  1348. <span class="keyword">public</span><span class="special">:</span>
  1349. <span class="comment">// A void virtual public function (that does not override).</span>
  1350. <span class="keyword">virtual</span> <span class="identifier">t</span> <span class="identifier">f</span><span class="special">(</span><span class="identifier">t_1</span> <span class="identifier">a_1</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">t_n</span> <span class="identifier">a_n</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">0</span><span class="special">)</span> <span class="special">{</span>
  1351. <span class="identifier">t</span> <span class="identifier">result</span><span class="special">;</span>
  1352. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span>
  1353. <span class="identifier">v</span><span class="special">,</span> <span class="identifier">result</span><span class="special">,</span> <span class="keyword">this</span><span class="special">)</span> <span class="comment">// Result parameter...</span>
  1354. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span> <span class="special">...</span> <span class="special">})</span>
  1355. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">(</span><span class="identifier">t</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">result</span><span class="special">)</span> <span class="special">{</span> <span class="special">...</span> <span class="special">})</span> <span class="comment">// ...so unary functor.</span>
  1356. <span class="special">.</span><span class="identifier">except</span><span class="special">([&amp;]</span> <span class="special">{</span> <span class="special">...</span> <span class="special">})</span>
  1357. <span class="special">;</span>
  1358. <span class="special">...</span> <span class="comment">// Assign `result` at each return.</span>
  1359. <span class="special">}</span>
  1360. <span class="special">...</span>
  1361. <span class="special">}</span>
  1362. </pre>
  1363. <div class="important"><table border="0" summary="Important">
  1364. <tr>
  1365. <td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../../../doc/src/images/important.png"></td>
  1366. <th align="left">Important</th>
  1367. </tr>
  1368. <tr><td align="left" valign="top">
  1369. <p>
  1370. It is the responsibility of the programmers to pass the extra virtual parameter
  1371. <code class="computeroutput"><span class="identifier">v</span></code> to all <code class="computeroutput"><a class="link" href="../BOOST_CONTRACT_OLDOF.html" title="Macro BOOST_CONTRACT_OLDOF">BOOST_CONTRACT_OLDOF</a></code>
  1372. and <code class="computeroutput"><a class="link" href="../boost/contract/public_f_idm45394998885120.html" title="Function template public_function">boost::contract::public_function</a></code>
  1373. calls within virtual public functions, and also to pass the return value
  1374. reference after <code class="computeroutput"><span class="identifier">v</span></code> to <code class="computeroutput"><a class="link" href="../boost/contract/public_f_idm45394998885120.html" title="Function template public_function">boost::contract::public_function</a></code>
  1375. for non-void virtual public functions. This library cannot automatically
  1376. generate compile-time errors if programmers fail to do so (but in general
  1377. this will prevent the library from correctly checking contracts at run-time).
  1378. <a href="#ftn.boost_contract.tutorial.virtual_public_functions.f3" class="footnote" name="boost_contract.tutorial.virtual_public_functions.f3"><sup class="footnote">[42]</sup></a>
  1379. </p>
  1380. <p>
  1381. <span class="bold"><strong>Mnemonics:</strong></span>
  1382. </p>
  1383. <div class="blockquote"><blockquote class="blockquote"><p>
  1384. When <code class="computeroutput"><span class="identifier">v</span></code> is present, always
  1385. pass it as the first argument to <code class="computeroutput"><a class="link" href="../boost/contract/public_f_idm45394998885120.html" title="Function template public_function">boost::contract::public_function</a></code>
  1386. and <code class="computeroutput"><a class="link" href="../BOOST_CONTRACT_OLDOF.html" title="Macro BOOST_CONTRACT_OLDOF">BOOST_CONTRACT_OLDOF</a></code>.
  1387. </p></blockquote></div>
  1388. <div class="blockquote"><blockquote class="blockquote"><p>
  1389. Always pass <code class="computeroutput"><span class="identifier">result</span></code> to
  1390. <code class="computeroutput"><a class="link" href="../boost/contract/public_f_idm45394998885120.html" title="Function template public_function">boost::contract::public_function</a></code>
  1391. right after <code class="computeroutput"><span class="identifier">v</span></code> for non-void
  1392. functions.
  1393. </p></blockquote></div>
  1394. </td></tr>
  1395. </table></div>
  1396. <p>
  1397. For the rest, considerations made in <a class="link" href="tutorial.html#boost_contract.tutorial.public_functions" title="Public Functions">Public
  1398. Functions</a> apply to virtual public functions as well.
  1399. </p>
  1400. <div class="note"><table border="0" summary="Note">
  1401. <tr>
  1402. <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td>
  1403. <th align="left">Note</th>
  1404. </tr>
  1405. <tr><td align="left" valign="top"><p>
  1406. A virtual public function should always call <code class="computeroutput"><a class="link" href="../boost/contract/public_f_idm45394998885120.html" title="Function template public_function">boost::contract::public_function</a></code>
  1407. (even if it has no preconditions, no postconditions, no exception guarantees,
  1408. and its class has no invariants), otherwise this library will not be able
  1409. to correctly use it for subcontracting.
  1410. </p></td></tr>
  1411. </table></div>
  1412. </div>
  1413. <div class="section">
  1414. <div class="titlepage"><div><div><h3 class="title">
  1415. <a name="boost_contract.tutorial.public_function_overrides__subcontracting_"></a><a class="link" href="tutorial.html#boost_contract.tutorial.public_function_overrides__subcontracting_" title="Public Function Overrides (Subcontracting)">Public
  1416. Function Overrides (Subcontracting)</a>
  1417. </h3></div></div></div>
  1418. <p>
  1419. Contracts for public functions are programmed using <code class="computeroutput"><a class="link" href="../boost/contract/public_f_idm45394998885120.html" title="Function template public_function">boost::contract::public_function</a></code>.
  1420. In this section, let's consider public functions (virtual or not) that override
  1421. virtual public functions from one or more of their public base classes. For
  1422. example (see <a href="../../../example/features/public.cpp" target="_top"><code class="literal">public.cpp</code></a>):
  1423. <a href="#ftn.boost_contract.tutorial.public_function_overrides__subcontracting_.f0" class="footnote" name="boost_contract.tutorial.public_function_overrides__subcontracting_.f0"><sup class="footnote">[43]</sup></a>
  1424. </p>
  1425. <p>
  1426. </p>
  1427. <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">identifiers</span>
  1428. <span class="preprocessor">#define</span> <span class="identifier">BASES</span> <span class="keyword">public</span> <span class="identifier">unique_identifiers</span>
  1429. <span class="special">:</span> <span class="identifier">BASES</span>
  1430. <span class="special">{</span>
  1431. <span class="keyword">public</span><span class="special">:</span>
  1432. <span class="keyword">typedef</span> <span class="identifier">BOOST_CONTRACT_BASE_TYPES</span><span class="special">(</span><span class="identifier">BASES</span><span class="special">)</span> <span class="identifier">base_types</span><span class="special">;</span> <span class="comment">// Bases typedef.</span>
  1433. <span class="preprocessor">#undef</span> <span class="identifier">BASES</span>
  1434. <span class="keyword">void</span> <span class="identifier">invariant</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span> <span class="comment">// Check in AND with bases.</span>
  1435. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">empty</span><span class="special">()</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">));</span>
  1436. <span class="special">}</span>
  1437. </pre>
  1438. <p>
  1439. </p>
  1440. <p>
  1441. </p>
  1442. <pre class="programlisting"><span class="keyword">public</span><span class="special">:</span>
  1443. <span class="comment">// Contract for a public function override.</span>
  1444. <span class="keyword">int</span> <span class="identifier">push_back</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">id</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">0</span><span class="special">)</span> <span class="comment">/* override */</span> <span class="special">{</span>
  1445. <span class="keyword">int</span> <span class="identifier">result</span><span class="special">;</span>
  1446. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="keyword">bool</span><span class="special">&gt;</span> <span class="identifier">old_find</span> <span class="special">=</span>
  1447. <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">v</span><span class="special">,</span> <span class="identifier">find</span><span class="special">(</span><span class="identifier">id</span><span class="special">));</span>
  1448. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">old_size</span> <span class="special">=</span>
  1449. <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">v</span><span class="special">,</span> <span class="identifier">size</span><span class="special">());</span>
  1450. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">&lt;</span>
  1451. <span class="identifier">override_push_back</span> <span class="comment">// Pass override type plus below function pointer...</span>
  1452. <span class="special">&gt;(</span><span class="identifier">v</span><span class="special">,</span> <span class="identifier">result</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">identifiers</span><span class="special">::</span><span class="identifier">push_back</span><span class="special">,</span> <span class="keyword">this</span><span class="special">,</span> <span class="identifier">id</span><span class="special">)</span> <span class="comment">// ...and arguments.</span>
  1453. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span> <span class="comment">// Check in OR with bases.</span>
  1454. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">id</span> <span class="special">&gt;=</span> <span class="number">0</span><span class="special">);</span>
  1455. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">find</span><span class="special">(</span><span class="identifier">id</span><span class="special">));</span> <span class="comment">// ID can be already present.</span>
  1456. <span class="special">})</span>
  1457. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">(</span><span class="keyword">int</span> <span class="keyword">const</span> <span class="identifier">result</span><span class="special">)</span> <span class="special">{</span> <span class="comment">// Check in AND with bases.</span>
  1458. <span class="keyword">if</span><span class="special">(*</span><span class="identifier">old_find</span><span class="special">)</span> <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="special">*</span><span class="identifier">old_size</span><span class="special">);</span>
  1459. <span class="special">})</span>
  1460. <span class="special">;</span>
  1461. <span class="comment">// Function body.</span>
  1462. <span class="keyword">if</span><span class="special">(!</span><span class="identifier">find</span><span class="special">(</span><span class="identifier">id</span><span class="special">))</span> <span class="identifier">unique_identifiers</span><span class="special">::</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">id</span><span class="special">);</span> <span class="comment">// Else, do nothing.</span>
  1463. <span class="keyword">return</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">id</span><span class="special">;</span>
  1464. <span class="special">}</span>
  1465. <span class="identifier">BOOST_CONTRACT_OVERRIDE</span><span class="special">(</span><span class="identifier">push_back</span><span class="special">)</span> <span class="comment">// Define `override_push_back`.</span>
  1466. </pre>
  1467. <p>
  1468. </p>
  1469. <p>
  1470. </p>
  1471. <pre class="programlisting"> <span class="comment">/* ... */</span>
  1472. <span class="special">};</span>
  1473. </pre>
  1474. <p>
  1475. </p>
  1476. <p>
  1477. The extra <code class="computeroutput"><span class="keyword">typedef</span></code> declared using
  1478. <code class="computeroutput"><a class="link" href="../BOOST_CONTRACT_BASE_TYPES.html" title="Macro BOOST_CONTRACT_BASE_TYPES">BOOST_CONTRACT_BASE_TYPES</a></code>
  1479. is required by this library for derived classes and it is internally used
  1480. to detect base classes for subcontracting (see <a class="link" href="tutorial.html#boost_contract.tutorial.base_classes__subcontracting_" title="Base Classes (Subcontracting)">Base
  1481. Classes</a>). This library will generate a compile-time error if there
  1482. is no suitable virtual function to override in any of the public base classes
  1483. for subcontracting. <a href="#ftn.boost_contract.tutorial.public_function_overrides__subcontracting_.f1" class="footnote" name="boost_contract.tutorial.public_function_overrides__subcontracting_.f1"><sup class="footnote">[44]</sup></a>
  1484. </p>
  1485. <p>
  1486. When called from public function overrides, the <code class="computeroutput"><a class="link" href="../boost/contract/public_f_idm45394998885120.html" title="Function template public_function">boost::contract::public_function</a></code>
  1487. function template takes an explicit template argument <code class="computeroutput"><span class="identifier">override_</span></code><code class="literal"><span class="emphasis"><em>function-name</em></span></code>
  1488. that must be defined using <code class="computeroutput"><a class="link" href="../BOOST_CONTRACT_OVERRIDE.html" title="Macro BOOST_CONTRACT_OVERRIDE">BOOST_CONTRACT_OVERRIDE</a></code>:
  1489. </p>
  1490. <pre class="programlisting"><span class="identifier">BOOST_CONTRACT_OVERRIDE</span><span class="special">(</span><code class="literal"><span class="emphasis"><em>function-name</em></span></code><span class="special">)</span>
  1491. </pre>
  1492. <p>
  1493. This can be declared at any point in the public section of the enclosing
  1494. class (see <a class="link" href="advanced.html#boost_contract.advanced.access_specifiers" title="Access Specifiers">Access
  1495. Specifiers</a> to use <code class="computeroutput"><a class="link" href="../BOOST_CONTRACT_OVERRIDE.html" title="Macro BOOST_CONTRACT_OVERRIDE">BOOST_CONTRACT_OVERRIDE</a></code>
  1496. also in a non-public section of the class). <code class="computeroutput"><a class="link" href="../BOOST_CONTRACT_OVERRIDE.html" title="Macro BOOST_CONTRACT_OVERRIDE">BOOST_CONTRACT_OVERRIDE</a></code>
  1497. is used only once in a class for a given function name and overloaded functions
  1498. can reuse the same <code class="literal">override_<span class="emphasis"><em>function-name</em></span></code>
  1499. definition (see <a class="link" href="advanced.html#boost_contract.advanced.function_overloads" title="Function Overloads">Function
  1500. Overloads</a>). <code class="computeroutput"><a class="link" href="../BOOST_CO_idm45394998912688.html" title="Macro BOOST_CONTRACT_NAMED_OVERRIDE">BOOST_CONTRACT_NAMED_OVERRIDE</a></code>
  1501. can be used to generate a name different than <code class="literal">override_<span class="emphasis"><em>function-name</em></span></code>
  1502. (e.g., to avoid generating C++ reserved names containing double underscores
  1503. "<code class="computeroutput"><span class="identifier">__</span></code>" for function
  1504. names that already start with an underscore "<code class="computeroutput"><span class="identifier">_</span></code>",
  1505. see <a class="link" href="advanced.html#boost_contract.advanced.named_overrides" title="Named Overrides">Named Overrides</a>).
  1506. For convenience <code class="computeroutput"><a class="link" href="../BOOST_CONTRACT_OVERRIDES.html" title="Macro BOOST_CONTRACT_OVERRIDES">BOOST_CONTRACT_OVERRIDES</a></code>
  1507. can be used with multiple function names instead of repeating <code class="computeroutput"><a class="link" href="../BOOST_CONTRACT_OVERRIDE.html" title="Macro BOOST_CONTRACT_OVERRIDE">BOOST_CONTRACT_OVERRIDE</a></code> for each
  1508. function name (on compilers that support variadic macros). For example, for
  1509. three functions named <code class="computeroutput"><span class="identifier">f</span></code>,
  1510. <code class="computeroutput"><span class="identifier">g</span></code>, and <code class="computeroutput"><span class="identifier">h</span></code>
  1511. (but same for any other number of functions), the following:
  1512. </p>
  1513. <pre class="programlisting"><span class="identifier">BOOST_CONTRACT_OVERRIDES</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span> <span class="identifier">g</span><span class="special">,</span> <span class="identifier">h</span><span class="special">)</span>
  1514. </pre>
  1515. <p>
  1516. Is equivalent to: <a href="#ftn.boost_contract.tutorial.public_function_overrides__subcontracting_.f2" class="footnote" name="boost_contract.tutorial.public_function_overrides__subcontracting_.f2"><sup class="footnote">[45]</sup></a>
  1517. </p>
  1518. <pre class="programlisting"><span class="identifier">BOOST_CONTRACT_OVERRIDE</span><span class="special">(</span><span class="identifier">f</span><span class="special">)</span>
  1519. <span class="identifier">BOOST_CONTRACT_OVERRIDE</span><span class="special">(</span><span class="identifier">g</span><span class="special">)</span>
  1520. <span class="identifier">BOOST_CONTRACT_OVERRIDE</span><span class="special">(</span><span class="identifier">h</span><span class="special">)</span>
  1521. </pre>
  1522. <p>
  1523. Public function overrides must always list the extra trailing parameter of
  1524. type <code class="computeroutput"><a class="link" href="../boost/contract/virtual_.html" title="Class virtual_">boost::contract::virtual_</a></code><code class="computeroutput"><span class="special">*</span></code> with default value <code class="computeroutput"><span class="number">0</span></code>
  1525. (i.e., <code class="computeroutput"><span class="keyword">nullptr</span></code>), even when they
  1526. are not declared <code class="computeroutput"><span class="keyword">virtual</span></code>, if
  1527. this parameter is present in the signature of the virtual function being
  1528. overridden from base classes. Programmers must pass the extra virtual parameter
  1529. as the very first argument to all <code class="computeroutput"><a class="link" href="../BOOST_CONTRACT_OLDOF.html" title="Macro BOOST_CONTRACT_OLDOF">BOOST_CONTRACT_OLDOF</a></code>
  1530. and <code class="computeroutput"><a class="link" href="../boost/contract/public_f_idm45394998885120.html" title="Function template public_function">boost::contract::public_function</a></code>
  1531. calls in the public function override definition (see <a class="link" href="tutorial.html#boost_contract.tutorial.virtual_public_functions" title="Virtual Public Functions">Virtual
  1532. Public Functions</a>).
  1533. </p>
  1534. <p>
  1535. When called from public function overrides, the <code class="computeroutput"><a class="link" href="../boost/contract/public_f_idm45394998885120.html" title="Function template public_function">boost::contract::public_function</a></code>
  1536. function takes a pointer to the enclosing function, the object <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> (because
  1537. public function overrides check class invariants, see <a class="link" href="tutorial.html#boost_contract.tutorial.class_invariants" title="Class Invariants">Class
  1538. Invariants</a>), and references to each function argument in the order
  1539. they appear in the function declaration. <a href="#ftn.boost_contract.tutorial.public_function_overrides__subcontracting_.f3" class="footnote" name="boost_contract.tutorial.public_function_overrides__subcontracting_.f3"><sup class="footnote">[46]</sup></a> For public function overrides returning <code class="computeroutput"><span class="keyword">void</span></code>:
  1540. </p>
  1541. <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">u</span> <span class="special">{</span>
  1542. <span class="keyword">public</span><span class="special">:</span>
  1543. <span class="comment">// A void public function override.</span>
  1544. <span class="keyword">void</span> <span class="identifier">f</span><span class="special">(</span><span class="identifier">t_1</span> <span class="identifier">a_1</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">t_n</span> <span class="identifier">a_n</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">0</span><span class="special">)</span> <span class="comment">/* override */</span> <span class="special">{</span>
  1545. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">&lt;</span><span class="identifier">override_f</span><span class="special">&gt;(</span>
  1546. <span class="identifier">v</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">u</span><span class="special">::</span><span class="identifier">f</span><span class="special">,</span> <span class="keyword">this</span><span class="special">,</span> <span class="identifier">a_1</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">a_n</span><span class="special">)</span> <span class="comment">// No result parameter...</span>
  1547. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span> <span class="special">...</span> <span class="special">})</span>
  1548. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span> <span class="special">...</span> <span class="special">})</span> <span class="comment">// ...so nullary functor.</span>
  1549. <span class="special">.</span><span class="identifier">except</span><span class="special">([&amp;]</span> <span class="special">{</span> <span class="special">...</span> <span class="special">})</span>
  1550. <span class="special">;</span>
  1551. <span class="special">...</span>
  1552. <span class="special">}</span>
  1553. <span class="identifier">BOOST_CONTRACT_OVERRIDE</span><span class="special">(</span><span class="identifier">f</span><span class="special">)</span>
  1554. <span class="special">...</span>
  1555. <span class="special">}</span>
  1556. </pre>
  1557. <p>
  1558. For public function overrides not returning <code class="computeroutput"><span class="keyword">void</span></code>,
  1559. programmers must also pass a reference to the function return value as the
  1560. second argument to <code class="computeroutput"><a class="link" href="../boost/contract/public_f_idm45394998885120.html" title="Function template public_function">boost::contract::public_function</a></code>
  1561. (this library will generate a compile-time error otherwise). <a href="#ftn.boost_contract.tutorial.public_function_overrides__subcontracting_.f4" class="footnote" name="boost_contract.tutorial.public_function_overrides__subcontracting_.f4"><sup class="footnote">[47]</sup></a> In this case, the library will pass this return value reference
  1562. to the postcondition functor that must therefore take one single argument
  1563. matching the return type, otherwise this library will generate a compile-time
  1564. error (the functor parameter can be a constant reference <code class="computeroutput"><span class="keyword">const</span><span class="special">&amp;</span></code> to avoid extra copies of the return
  1565. value, similarly to non-overriding non-void <a class="link" href="tutorial.html#boost_contract.tutorial.virtual_public_functions" title="Virtual Public Functions">Virtual
  1566. Public Functions</a>):
  1567. </p>
  1568. <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">u</span> <span class="special">{</span>
  1569. <span class="keyword">public</span><span class="special">:</span>
  1570. <span class="comment">// A non-void public function override.</span>
  1571. <span class="identifier">t</span> <span class="identifier">f</span><span class="special">(</span><span class="identifier">t_1</span> <span class="identifier">a_1</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">t_n</span> <span class="identifier">a_n</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">0</span><span class="special">)</span> <span class="comment">/* override */</span> <span class="special">{</span>
  1572. <span class="identifier">t</span> <span class="identifier">result</span><span class="special">;</span>
  1573. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">&lt;</span><span class="identifier">override_f</span><span class="special">&gt;(</span>
  1574. <span class="identifier">v</span><span class="special">,</span> <span class="identifier">result</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">u</span><span class="special">::</span><span class="identifier">f</span><span class="special">,</span> <span class="keyword">this</span><span class="special">,</span> <span class="identifier">a_1</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">a_n</span><span class="special">)</span> <span class="comment">// Result parameter...</span>
  1575. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span> <span class="special">...</span> <span class="special">})</span>
  1576. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">(</span><span class="identifier">t</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">result</span><span class="special">)</span> <span class="special">{</span> <span class="special">...</span> <span class="special">})</span> <span class="comment">// ...so unary functor.</span>
  1577. <span class="special">.</span><span class="identifier">except</span><span class="special">([&amp;]</span> <span class="special">{</span> <span class="special">...</span> <span class="special">})</span>
  1578. <span class="special">;</span>
  1579. <span class="special">...</span> <span class="comment">// Assign `result` at each return.</span>
  1580. <span class="special">}</span>
  1581. <span class="identifier">BOOST_CONTRACT_OVERRIDE</span><span class="special">(</span><span class="identifier">f</span><span class="special">)</span>
  1582. <span class="special">...</span>
  1583. <span class="special">}</span>
  1584. </pre>
  1585. <p>
  1586. This library will throw <code class="computeroutput"><a class="link" href="../boost/contract/bad_virtual_result_cast.html" title="Class bad_virtual_result_cast">boost::contract::bad_virtual_result_cast</a></code>
  1587. if programmers specify return values for public function overrides in derived
  1588. classes that are not consistent with the return types of the virtual public
  1589. functions being overridden in the base classes. <a href="#ftn.boost_contract.tutorial.public_function_overrides__subcontracting_.f5" class="footnote" name="boost_contract.tutorial.public_function_overrides__subcontracting_.f5"><sup class="footnote">[48]</sup></a>
  1590. </p>
  1591. <div class="important"><table border="0" summary="Important">
  1592. <tr>
  1593. <td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../../../doc/src/images/important.png"></td>
  1594. <th align="left">Important</th>
  1595. </tr>
  1596. <tr><td align="left" valign="top">
  1597. <p>
  1598. It is the responsibility of the programmers to pass the extra virtual parameter
  1599. <code class="computeroutput"><span class="identifier">v</span></code> to all <code class="computeroutput"><a class="link" href="../BOOST_CONTRACT_OLDOF.html" title="Macro BOOST_CONTRACT_OLDOF">BOOST_CONTRACT_OLDOF</a></code>
  1600. and <code class="computeroutput"><a class="link" href="../boost/contract/public_f_idm45394998885120.html" title="Function template public_function">boost::contract::public_function</a></code>
  1601. calls within public function overrides, and also to pass the return value
  1602. reference after <code class="computeroutput"><span class="identifier">v</span></code> to <code class="computeroutput"><a class="link" href="../boost/contract/public_f_idm45394998885120.html" title="Function template public_function">boost::contract::public_function</a></code>
  1603. for non-void public function overrides. This library cannot always generate
  1604. compile-time errors if programmers fail to do so (but in general this will
  1605. prevent the library from correctly checking contracts at run-time).
  1606. </p>
  1607. <p>
  1608. <span class="bold"><strong>Mnemonics:</strong></span>
  1609. </p>
  1610. <div class="blockquote"><blockquote class="blockquote"><p>
  1611. When <code class="computeroutput"><span class="identifier">override_</span><span class="special">...</span></code>
  1612. is present, always pass it as template parameter to <code class="computeroutput"><a class="link" href="../boost/contract/public_f_idm45394998885120.html" title="Function template public_function">boost::contract::public_function</a></code>.
  1613. </p></blockquote></div>
  1614. <div class="blockquote"><blockquote class="blockquote"><p>
  1615. When <code class="computeroutput"><span class="identifier">v</span></code> is present, always
  1616. pass it as the first argument to <code class="computeroutput"><a class="link" href="../boost/contract/public_f_idm45394998885120.html" title="Function template public_function">boost::contract::public_function</a></code>
  1617. and <code class="computeroutput"><a class="link" href="../BOOST_CONTRACT_OLDOF.html" title="Macro BOOST_CONTRACT_OLDOF">BOOST_CONTRACT_OLDOF</a></code>.
  1618. </p></blockquote></div>
  1619. <div class="blockquote"><blockquote class="blockquote"><p>
  1620. Always pass <code class="computeroutput"><span class="identifier">result</span></code> to
  1621. <code class="computeroutput"><a class="link" href="../boost/contract/public_f_idm45394998885120.html" title="Function template public_function">boost::contract::public_function</a></code>
  1622. right after <code class="computeroutput"><span class="identifier">v</span></code> for non-void
  1623. functions.
  1624. </p></blockquote></div>
  1625. </td></tr>
  1626. </table></div>
  1627. <p>
  1628. At construction, the <code class="computeroutput"><a class="link" href="../boost/contract/check.html" title="Class check">boost::contract::check</a></code>
  1629. RAII object for public function overrides does the following (enclosing public
  1630. function override entry):
  1631. </p>
  1632. <div class="orderedlist"><ol class="orderedlist" type="1">
  1633. <li class="listitem">
  1634. Check static and non-static class invariants for all overridden bases
  1635. and for the derived class in <a class="link" href="contract_programming_overview.html#and_anchor"><code class="literal"><span class="emphasis"><em>AND</em></span></code></a>
  1636. with each other, by calling <code class="literal"><span class="emphasis"><em>type-of</em></span>(<span class="emphasis"><em>overridden-base_1</em></span>)</code><code class="computeroutput"><span class="special">::</span><span class="identifier">static_invariant</span><span class="special">()</span></code> <a class="link" href="contract_programming_overview.html#and_anchor"><code class="literal"><span class="emphasis"><em>AND</em></span></code></a>
  1637. <code class="literal"><span class="emphasis"><em>overridden-base_1</em></span></code><code class="computeroutput"><span class="special">.</span><span class="identifier">invariant</span><span class="special">()</span></code> <a class="link" href="contract_programming_overview.html#and_anchor"><code class="literal"><span class="emphasis"><em>AND</em></span></code></a>...
  1638. <code class="literal"><span class="emphasis"><em>type-of</em></span>(<span class="emphasis"><em>overridden-base_n</em></span>)</code><code class="computeroutput"><span class="special">::</span><span class="identifier">static_invariant</span><span class="special">()</span></code> <a class="link" href="contract_programming_overview.html#and_anchor"><code class="literal"><span class="emphasis"><em>AND</em></span></code></a>
  1639. <code class="literal"><span class="emphasis"><em>overridden-base_n</em></span></code><code class="computeroutput"><span class="special">.</span><span class="identifier">invariant</span><span class="special">()</span></code> <a class="link" href="contract_programming_overview.html#and_anchor"><code class="literal"><span class="emphasis"><em>AND</em></span></code></a>
  1640. <code class="literal"><span class="emphasis"><em>type-of</em></span></code><code class="computeroutput"><span class="special">(*</span><span class="keyword">this</span><span class="special">)::</span><span class="identifier">static_invariant</span><span class="special">()</span></code>
  1641. <a class="link" href="contract_programming_overview.html#and_anchor"><code class="literal"><span class="emphasis"><em>AND</em></span></code></a>
  1642. <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">invariant</span><span class="special">()</span></code>.
  1643. </li>
  1644. <li class="listitem">
  1645. Check preconditions for all overridden base functions and for the overriding
  1646. derived function in <a class="link" href="contract_programming_overview.html#or_anchor"><code class="literal"><span class="emphasis"><em>OR</em></span></code></a>
  1647. with each other, by calling the nullary functors <code class="literal"><span class="emphasis"><em>r_1</em></span></code><code class="computeroutput"><span class="special">()</span></code> <a class="link" href="contract_programming_overview.html#or_anchor"><code class="literal"><span class="emphasis"><em>OR</em></span></code></a>...
  1648. <code class="literal"><span class="emphasis"><em>r_n</em></span></code><code class="computeroutput"><span class="special">()</span></code>
  1649. <a class="link" href="contract_programming_overview.html#or_anchor"><code class="literal"><span class="emphasis"><em>OR</em></span></code></a>
  1650. <code class="literal"><span class="emphasis"><em>r</em></span></code><code class="computeroutput"><span class="special">()</span></code>
  1651. passed to <code class="computeroutput"><span class="special">.</span><span class="identifier">precondition</span><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>r_1</em></span></code><code class="computeroutput"><span class="special">)</span></code>, ... <code class="computeroutput"><span class="special">.</span><span class="identifier">precondition</span><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>r_n</em></span></code><code class="computeroutput"><span class="special">)</span></code>, <code class="computeroutput"><span class="special">.</span><span class="identifier">precondition</span><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>r</em></span></code><code class="computeroutput"><span class="special">)</span></code> for all of the overridden and overriding
  1652. functions respectively.
  1653. </li>
  1654. </ol></div>
  1655. <p>
  1656. At destruction instead (enclosing public function override exit):
  1657. </p>
  1658. <div class="orderedlist"><ol class="orderedlist" type="1">
  1659. <li class="listitem">
  1660. Check static and non-static class invariants for all overridden bases
  1661. and for the derived class in <a class="link" href="contract_programming_overview.html#and_anchor"><code class="literal"><span class="emphasis"><em>AND</em></span></code></a>
  1662. with each other, by calling <code class="literal"><span class="emphasis"><em>type-of</em></span>(<span class="emphasis"><em>overridden-base_1</em></span>)</code><code class="computeroutput"><span class="special">::</span><span class="identifier">static_invariant</span><span class="special">()</span></code> <a class="link" href="contract_programming_overview.html#and_anchor"><code class="literal"><span class="emphasis"><em>AND</em></span></code></a>
  1663. <code class="literal"><span class="emphasis"><em>overridden-base_1</em></span></code><code class="computeroutput"><span class="special">.</span><span class="identifier">invariant</span><span class="special">()</span></code> <a class="link" href="contract_programming_overview.html#and_anchor"><code class="literal"><span class="emphasis"><em>AND</em></span></code></a>...
  1664. <code class="literal"><span class="emphasis"><em>type-of</em></span>(<span class="emphasis"><em>overridden-base_n</em></span>)</code><code class="computeroutput"><span class="special">::</span><span class="identifier">static_invariant</span><span class="special">()</span></code> <a class="link" href="contract_programming_overview.html#and_anchor"><code class="literal"><span class="emphasis"><em>AND</em></span></code></a>
  1665. <code class="literal"><span class="emphasis"><em>overridden-base_n</em></span></code><code class="computeroutput"><span class="special">.</span><span class="identifier">invariant</span><span class="special">()</span></code> <a class="link" href="contract_programming_overview.html#and_anchor"><code class="literal"><span class="emphasis"><em>AND</em></span></code></a>
  1666. <code class="literal"><span class="emphasis"><em>type-of</em></span></code><code class="computeroutput"><span class="special">(*</span><span class="keyword">this</span><span class="special">)::</span><span class="identifier">static_invariant</span><span class="special">()</span></code>
  1667. <a class="link" href="contract_programming_overview.html#and_anchor"><code class="literal"><span class="emphasis"><em>AND</em></span></code></a>
  1668. <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">invariant</span><span class="special">()</span></code>
  1669. (even if the function body threw an exception).
  1670. </li>
  1671. <li class="listitem">
  1672. If the function body did not throw an exception:
  1673. <div class="orderedlist"><ol class="orderedlist" type="a"><li class="listitem">
  1674. Check postconditions for all overridden base functions and for
  1675. the overriding derived function in <a class="link" href="contract_programming_overview.html#and_anchor"><code class="literal"><span class="emphasis"><em>AND</em></span></code></a>
  1676. with each other, by calling the nullary functors <code class="literal"><span class="emphasis"><em>s_1</em></span></code><code class="computeroutput"><span class="special">()</span></code> <a class="link" href="contract_programming_overview.html#and_anchor"><code class="literal"><span class="emphasis"><em>AND</em></span></code></a>...
  1677. <code class="literal"><span class="emphasis"><em>s_n</em></span></code><code class="computeroutput"><span class="special">()</span></code>
  1678. <a class="link" href="contract_programming_overview.html#and_anchor"><code class="literal"><span class="emphasis"><em>AND</em></span></code></a>
  1679. <code class="literal"><span class="emphasis"><em>s</em></span></code><code class="computeroutput"><span class="special">()</span></code>
  1680. passed to <code class="computeroutput"><span class="special">.</span><span class="identifier">postcondition</span><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>s_1</em></span></code><code class="computeroutput"><span class="special">)</span></code>, ... <code class="computeroutput"><span class="special">.</span><span class="identifier">postcondition</span><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>s_n</em></span></code><code class="computeroutput"><span class="special">)</span></code>, <code class="computeroutput"><span class="special">.</span><span class="identifier">postcondition</span><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>s</em></span></code><code class="computeroutput"><span class="special">)</span></code> for all of the overridden and
  1681. overriding functions respectively (or the unary functors <code class="literal"><span class="emphasis"><em>s_1</em></span></code><code class="computeroutput"><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>result</em></span></code><code class="computeroutput"><span class="special">)</span></code> <a class="link" href="contract_programming_overview.html#and_anchor"><code class="literal"><span class="emphasis"><em>AND</em></span></code></a>...
  1682. <code class="literal"><span class="emphasis"><em>s_n</em></span></code><code class="computeroutput"><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>result</em></span></code><code class="computeroutput"><span class="special">)</span></code> <a class="link" href="contract_programming_overview.html#and_anchor"><code class="literal"><span class="emphasis"><em>AND</em></span></code></a>
  1683. <code class="literal"><span class="emphasis"><em>s</em></span></code><code class="computeroutput"><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>result</em></span></code><code class="computeroutput"><span class="special">)</span></code> for non-void public function overrides).
  1684. </li></ol></div>
  1685. </li>
  1686. <li class="listitem">
  1687. Else:
  1688. <div class="orderedlist"><ol class="orderedlist" type="a"><li class="listitem">
  1689. Check exception guarantees for all overridden base functions and
  1690. for the overriding derived function in <a class="link" href="contract_programming_overview.html#and_anchor"><code class="literal"><span class="emphasis"><em>AND</em></span></code></a>
  1691. with each other, by calling the nullary functors <code class="literal"><span class="emphasis"><em>e_1</em></span></code><code class="computeroutput"><span class="special">()</span></code> <a class="link" href="contract_programming_overview.html#and_anchor"><code class="literal"><span class="emphasis"><em>AND</em></span></code></a>...
  1692. <code class="literal"><span class="emphasis"><em>e_n</em></span></code><code class="computeroutput"><span class="special">()</span></code>
  1693. <a class="link" href="contract_programming_overview.html#and_anchor"><code class="literal"><span class="emphasis"><em>AND</em></span></code></a>
  1694. <code class="literal"><span class="emphasis"><em>e</em></span></code><code class="computeroutput"><span class="special">()</span></code>
  1695. passed to <code class="computeroutput"><span class="special">.</span><span class="identifier">except</span><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>e_1</em></span></code><code class="computeroutput"><span class="special">)</span></code>, ... <code class="computeroutput"><span class="special">.</span><span class="identifier">except</span><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>e_n</em></span></code><code class="computeroutput"><span class="special">)</span></code>, <code class="computeroutput"><span class="special">.</span><span class="identifier">except</span><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>e</em></span></code><code class="computeroutput"><span class="special">)</span></code> for all of the overridden and
  1696. overriding functions respectively.
  1697. </li></ol></div>
  1698. </li>
  1699. </ol></div>
  1700. <p>
  1701. This ensures that contracts and subcontracts of public function overrides
  1702. are correctly checked at run-time in accordance with the <a href="http://en.wikipedia.org/wiki/Liskov_substitution_principle" target="_top">substitution
  1703. principle</a> (see <a class="link" href="contract_programming_overview.html#boost_contract.contract_programming_overview.public_function_calls" title="Public Function Calls">Public
  1704. Function Calls</a>).
  1705. </p>
  1706. <p>
  1707. For the rest, considerations made in <a class="link" href="tutorial.html#boost_contract.tutorial.virtual_public_functions" title="Virtual Public Functions">Virtual
  1708. Public Functions</a> apply to public function overrides as well.
  1709. </p>
  1710. <div class="note"><table border="0" summary="Note">
  1711. <tr>
  1712. <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td>
  1713. <th align="left">Note</th>
  1714. </tr>
  1715. <tr><td align="left" valign="top"><p>
  1716. A public function override should always call <code class="computeroutput"><a class="link" href="../boost/contract/public_f_idm45394998885120.html" title="Function template public_function">boost::contract::public_function</a></code>
  1717. (even if it has no preconditions, no postconditions, no exception guarantees,
  1718. and its class has no invariants), otherwise this library will not be able
  1719. to correctly use it for subcontracting.
  1720. </p></td></tr>
  1721. </table></div>
  1722. </div>
  1723. <div class="section">
  1724. <div class="titlepage"><div><div><h3 class="title">
  1725. <a name="boost_contract.tutorial.base_classes__subcontracting_"></a><a class="link" href="tutorial.html#boost_contract.tutorial.base_classes__subcontracting_" title="Base Classes (Subcontracting)">Base
  1726. Classes (Subcontracting)</a>
  1727. </h3></div></div></div>
  1728. <p>
  1729. In order for this library to support subcontracting, programmers must specify
  1730. the bases of a derived class declaring a public member type named <code class="computeroutput"><span class="identifier">base_types</span></code> via a <code class="computeroutput"><span class="keyword">typedef</span></code>
  1731. using <code class="computeroutput"><a class="link" href="../BOOST_CONTRACT_BASE_TYPES.html" title="Macro BOOST_CONTRACT_BASE_TYPES">BOOST_CONTRACT_BASE_TYPES</a></code>.
  1732. For example (see <a href="../../../example/features/base_types.cpp" target="_top"><code class="literal">base_types.cpp</code></a>):
  1733. </p>
  1734. <p>
  1735. </p>
  1736. <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">chars</span>
  1737. <span class="preprocessor">#define</span> <span class="identifier">BASES</span> <span class="comment">/* local macro (for convenience) */</span> <span class="special">\</span>
  1738. <span class="keyword">private</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor_precondition</span><span class="special">&lt;</span><span class="identifier">chars</span><span class="special">&gt;,</span> <span class="special">\</span>
  1739. <span class="keyword">public</span> <span class="identifier">unique_chars</span><span class="special">,</span> <span class="special">\</span>
  1740. <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="identifier">pushable</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;,</span> <span class="special">\</span>
  1741. <span class="keyword">virtual</span> <span class="keyword">protected</span> <span class="identifier">has_size</span><span class="special">,</span> <span class="special">\</span>
  1742. <span class="keyword">private</span> <span class="identifier">has_empty</span>
  1743. <span class="special">:</span> <span class="identifier">BASES</span> <span class="comment">// Bases of this class.</span>
  1744. <span class="special">{</span>
  1745. <span class="keyword">public</span><span class="special">:</span>
  1746. <span class="keyword">typedef</span> <span class="identifier">BOOST_CONTRACT_BASE_TYPES</span><span class="special">(</span><span class="identifier">BASES</span><span class="special">)</span> <span class="identifier">base_types</span><span class="special">;</span> <span class="comment">// Bases typedef.</span>
  1747. <span class="preprocessor">#undef</span> <span class="identifier">BASES</span> <span class="comment">// Undefine local macro.</span>
  1748. <span class="comment">/* ... */</span>
  1749. </pre>
  1750. <p>
  1751. </p>
  1752. <p>
  1753. For convenience, a <span class="emphasis"><em>local macro</em></span> named <code class="computeroutput"><span class="identifier">BASES</span></code>
  1754. can be used to avoid repeating the base list twice (first in the derived
  1755. class declaration <code class="computeroutput"><span class="keyword">class</span> </code><code class="literal"><span class="emphasis"><em>class-name</em></span></code><code class="computeroutput">
  1756. <span class="special">:</span> </code><code class="literal"><span class="emphasis"><em>base-list</em></span></code>
  1757. and then again when invoking <code class="computeroutput"><span class="identifier">BOOST_CONTRACT_BASE_TYPES</span><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>base-list</em></span></code><code class="computeroutput"><span class="special">)</span></code>). Being a local macro, <code class="computeroutput"><span class="identifier">BASES</span></code>
  1758. must be undefined using <code class="computeroutput"><span class="preprocessor">#undef</span>
  1759. <span class="identifier">BASES</span></code> after it is used to declare
  1760. the <code class="computeroutput"><span class="identifier">base_types</span></code> <code class="computeroutput"><span class="keyword">typedef</span></code> (to avoid name clashes and macro redefinition
  1761. errors). <a href="#ftn.boost_contract.tutorial.base_classes__subcontracting_.f0" class="footnote" name="boost_contract.tutorial.base_classes__subcontracting_.f0"><sup class="footnote">[49]</sup></a>
  1762. </p>
  1763. <p>
  1764. <code class="computeroutput"><a class="link" href="../BOOST_CONTRACT_BASE_TYPES.html" title="Macro BOOST_CONTRACT_BASE_TYPES">BOOST_CONTRACT_BASE_TYPES</a></code>
  1765. is a variadic macro and accepts a list of bases separated by commas (see
  1766. <a class="link" href="extras.html#boost_contract.extras.no_macros__and_no_variadic_macros_" title="No Macros (and No Variadic Macros)">No
  1767. Macros</a> to program <code class="computeroutput"><span class="identifier">base_types</span></code>
  1768. without using macros). As already noted in <a class="link" href="tutorial.html#boost_contract.tutorial.constructors" title="Constructors">Constructors</a>,
  1769. when the extra base <code class="computeroutput"><a class="link" href="../boost/contract/constructor_precondition.html" title="Class template constructor_precondition">boost::contract::constructor_precondition</a></code>
  1770. is used to program constructor preconditions, its inheritance access level
  1771. must always be <code class="computeroutput"><span class="keyword">private</span></code> and it
  1772. must be specified as the very first base.
  1773. </p>
  1774. <div class="important"><table border="0" summary="Important">
  1775. <tr>
  1776. <td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../../../doc/src/images/important.png"></td>
  1777. <th align="left">Important</th>
  1778. </tr>
  1779. <tr><td align="left" valign="top">
  1780. <p>
  1781. Each base passed to <code class="computeroutput"><a class="link" href="../BOOST_CONTRACT_BASE_TYPES.html" title="Macro BOOST_CONTRACT_BASE_TYPES">BOOST_CONTRACT_BASE_TYPES</a></code>
  1782. must <span class="emphasis"><em>explicitly</em></span> specify its inheritance access level
  1783. <code class="computeroutput"><span class="keyword">public</span></code>, <code class="computeroutput"><span class="keyword">protected</span></code>,
  1784. or <code class="computeroutput"><span class="keyword">private</span></code> (but <code class="computeroutput"><span class="keyword">virtual</span></code> is optional and can be specified
  1785. either before or after the access level as usual in C++). This library
  1786. will generate a compile-time error if the first base is missing its inheritance
  1787. access level, but this library will not be able to always generate an error
  1788. if the access level is missing for bases after the first one. <a href="#ftn.boost_contract.tutorial.base_classes__subcontracting_.f1" class="footnote" name="boost_contract.tutorial.base_classes__subcontracting_.f1"><sup class="footnote">[50]</sup></a> It is the responsibility of the programmers to make sure that
  1789. all bases passed to <code class="computeroutput"><a class="link" href="../BOOST_CONTRACT_BASE_TYPES.html" title="Macro BOOST_CONTRACT_BASE_TYPES">BOOST_CONTRACT_BASE_TYPES</a></code>
  1790. explicitly specify their inheritance access level (inheritance access levels
  1791. are instead optional in C++ because <code class="computeroutput"><span class="keyword">private</span></code>
  1792. is implicitly assumed for <code class="computeroutput"><span class="keyword">class</span></code>
  1793. types and <code class="computeroutput"><span class="keyword">public</span></code> for <code class="computeroutput"><span class="keyword">struct</span></code> types).
  1794. </p>
  1795. <p>
  1796. <span class="bold"><strong>Mnemonics:</strong></span>
  1797. </p>
  1798. <div class="blockquote"><blockquote class="blockquote"><p>
  1799. Always explicitly specify the inheritance access level <code class="computeroutput"><span class="keyword">public</span></code>, <code class="computeroutput"><span class="keyword">protected</span></code>,
  1800. or <code class="computeroutput"><span class="keyword">private</span></code> for base classes
  1801. passed to <code class="computeroutput"><a class="link" href="../BOOST_CONTRACT_BASE_TYPES.html" title="Macro BOOST_CONTRACT_BASE_TYPES">BOOST_CONTRACT_BASE_TYPES</a></code>.
  1802. </p></blockquote></div>
  1803. </td></tr>
  1804. </table></div>
  1805. <p>
  1806. See <a class="link" href="advanced.html#boost_contract.advanced.access_specifiers" title="Access Specifiers">Access Specifiers</a>
  1807. to avoid making the <code class="computeroutput"><span class="identifier">base_types</span></code>
  1808. member type <code class="computeroutput"><span class="keyword">public</span></code>. <a href="#ftn.boost_contract.tutorial.base_classes__subcontracting_.f2" class="footnote" name="boost_contract.tutorial.base_classes__subcontracting_.f2"><sup class="footnote">[51]</sup></a> See <code class="computeroutput"><a class="link" href="../BOOST_CO_idm45394999732400.html" title="Macro BOOST_CONTRACT_BASES_TYPEDEF">BOOST_CONTRACT_BASES_TYPEDEF</a></code>
  1809. to use a name different from <code class="computeroutput"><span class="identifier">base_types</span></code>
  1810. (e.g., because <code class="computeroutput"><span class="identifier">base_types</span></code>
  1811. clashes with other names in user-defined classes).
  1812. </p>
  1813. </div>
  1814. <div class="section">
  1815. <div class="titlepage"><div><div><h3 class="title">
  1816. <a name="boost_contract.tutorial.static_public_functions"></a><a class="link" href="tutorial.html#boost_contract.tutorial.static_public_functions" title="Static Public Functions">Static
  1817. Public Functions</a>
  1818. </h3></div></div></div>
  1819. <p>
  1820. Contracts for public functions are programmed using <code class="computeroutput"><a class="link" href="../boost/contract/public_f_idm45394998885120.html" title="Function template public_function">boost::contract::public_function</a></code>.
  1821. In this section, let's consider static public functions. For example (see
  1822. <a href="../../../example/features/static_public.cpp" target="_top"><code class="literal">static_public.cpp</code></a>):
  1823. </p>
  1824. <p>
  1825. </p>
  1826. <pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">C</span><span class="special">&gt;</span>
  1827. <span class="keyword">class</span> <span class="identifier">make</span> <span class="special">{</span>
  1828. <span class="keyword">public</span><span class="special">:</span>
  1829. <span class="keyword">static</span> <span class="keyword">void</span> <span class="identifier">static_invariant</span><span class="special">()</span> <span class="special">{</span> <span class="comment">// Static class invariants.</span>
  1830. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">instances</span><span class="special">()</span> <span class="special">&gt;=</span> <span class="number">0</span><span class="special">);</span>
  1831. <span class="special">}</span>
  1832. <span class="comment">// Contract for a static public function.</span>
  1833. <span class="keyword">static</span> <span class="keyword">int</span> <span class="identifier">instances</span><span class="special">()</span> <span class="special">{</span>
  1834. <span class="comment">// Explicit template parameter `make` (check static invariants).</span>
  1835. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">&lt;</span><span class="identifier">make</span><span class="special">&gt;();</span>
  1836. <span class="keyword">return</span> <span class="identifier">instances_</span><span class="special">;</span> <span class="comment">// Function body.</span>
  1837. <span class="special">}</span>
  1838. <span class="comment">/* ... */</span>
  1839. </pre>
  1840. <p>
  1841. </p>
  1842. <p>
  1843. It is possible to specify preconditions, postconditions, and exception guarantees
  1844. for static public functions (see <a class="link" href="tutorial.html#boost_contract.tutorial.preconditions" title="Preconditions">Preconditions</a>,
  1845. <a class="link" href="tutorial.html#boost_contract.tutorial.postconditions" title="Postconditions">Postconditions</a>,
  1846. and <a class="link" href="tutorial.html#boost_contract.tutorial.exception_guarantees" title="Exception Guarantees">Exception
  1847. Guarantees</a>). When called from static public functions, <code class="computeroutput"><a class="link" href="../boost/contract/public_f_idm45394998885120.html" title="Function template public_function">boost::contract::public_function</a></code>
  1848. cannot take the object <code class="computeroutput"><span class="keyword">this</span></code>
  1849. as a parameter (because there is no object <code class="computeroutput"><span class="keyword">this</span></code>
  1850. in static member functions) so the enclosing class type is specified via
  1851. an explicit template parameter as in <code class="computeroutput"><a class="link" href="../boost/contract/public_f_idm45394998885120.html" title="Function template public_function">boost::contract::public_function</a></code><code class="literal">&lt;<span class="emphasis"><em>class-type</em></span>&gt;</code>
  1852. (the class type is required to check static class invariants, see <a class="link" href="tutorial.html#boost_contract.tutorial.class_invariants" title="Class Invariants">Class
  1853. Invariants</a>):
  1854. </p>
  1855. <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">u</span> <span class="special">{</span>
  1856. <span class="keyword">public</span><span class="special">:</span>
  1857. <span class="comment">// A static public function.</span>
  1858. <span class="keyword">static</span> <span class="keyword">void</span> <span class="identifier">f</span><span class="special">()</span> <span class="special">{</span>
  1859. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">&lt;</span><span class="identifier">u</span><span class="special">&gt;()</span> <span class="comment">// Class type `u` as explicit template parameter.</span>
  1860. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span> <span class="special">...</span> <span class="special">})</span>
  1861. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span> <span class="special">...</span> <span class="special">})</span>
  1862. <span class="special">.</span><span class="identifier">except</span><span class="special">([&amp;]</span> <span class="special">{</span> <span class="special">...</span> <span class="special">})</span>
  1863. <span class="special">;</span>
  1864. <span class="special">...</span>
  1865. <span class="special">}</span>
  1866. <span class="special">...</span>
  1867. <span class="special">};</span>
  1868. </pre>
  1869. <p>
  1870. The <code class="computeroutput"><a class="link" href="../boost/contract/public_f_idm45394998885120.html" title="Function template public_function">boost::contract::public_function</a></code>
  1871. function returns an RAII object that must be assigned to a local variable
  1872. of type <code class="computeroutput"><a class="link" href="../boost/contract/check.html" title="Class check">boost::contract::check</a></code>
  1873. (otherwise this library will generate a run-time error, see <code class="computeroutput"><a class="link" href="../BOOST_CO_idm45394999694064.html" title="Macro BOOST_CONTRACT_ON_MISSING_CHECK_DECL">BOOST_CONTRACT_ON_MISSING_CHECK_DECL</a></code>).
  1874. Furthermore, C++11 <code class="computeroutput"><span class="keyword">auto</span></code> declarations
  1875. cannot be used here and the <code class="computeroutput"><a class="link" href="../boost/contract/check.html" title="Class check">boost::contract::check</a></code>
  1876. type must be explicitly specified (otherwise this library will generate a
  1877. compile-time error prior C++17 and a run-time error post C++17). The static
  1878. public functions body is programmed right after the declaration of this RAII
  1879. object.
  1880. </p>
  1881. <p>
  1882. At construction, the <code class="computeroutput"><a class="link" href="../boost/contract/check.html" title="Class check">boost::contract::check</a></code>
  1883. RAII object for static public functions does the following (enclosing static
  1884. public function entry):
  1885. </p>
  1886. <div class="orderedlist"><ol class="orderedlist" type="1">
  1887. <li class="listitem">
  1888. Check static class invariants, by calling <code class="literal"><span class="emphasis"><em>class-type</em></span></code><code class="computeroutput"><span class="special">::</span><span class="identifier">static_invariant</span><span class="special">()</span></code> (but never non-static class invariants).
  1889. </li>
  1890. <li class="listitem">
  1891. Check preconditions, by calling the nullary functor <code class="literal"><span class="emphasis"><em>r</em></span></code><code class="computeroutput"><span class="special">()</span></code> passed to <code class="computeroutput"><span class="special">.</span><span class="identifier">precondition</span><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>r</em></span></code><code class="computeroutput"><span class="special">)</span></code>.
  1892. </li>
  1893. </ol></div>
  1894. <p>
  1895. At destruction instead (enclosing static public function exit):
  1896. </p>
  1897. <div class="orderedlist"><ol class="orderedlist" type="1">
  1898. <li class="listitem">
  1899. Check static class invariants, by calling <code class="literal"><span class="emphasis"><em>class-type</em></span></code><code class="computeroutput"><span class="special">::</span><span class="identifier">static_invariant</span><span class="special">()</span></code> (even if the function body threw an
  1900. exception, but never non-static class invariants).
  1901. </li>
  1902. <li class="listitem">
  1903. If the function body did not throw an exception:
  1904. <div class="orderedlist"><ol class="orderedlist" type="a"><li class="listitem">
  1905. Check postconditions, by calling the nullary functor <code class="literal"><span class="emphasis"><em>s</em></span></code><code class="computeroutput"><span class="special">()</span></code> passed to <code class="computeroutput"><span class="special">.</span><span class="identifier">postcondition</span><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>s</em></span></code><code class="computeroutput"><span class="special">)</span></code>.
  1906. </li></ol></div>
  1907. </li>
  1908. <li class="listitem">
  1909. Else:
  1910. <div class="orderedlist"><ol class="orderedlist" type="a"><li class="listitem">
  1911. Check exception guarantees, by calling the nullary functor <code class="literal"><span class="emphasis"><em>e</em></span></code><code class="computeroutput"><span class="special">()</span></code> passed to <code class="computeroutput"><span class="special">.</span><span class="identifier">except</span><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>e</em></span></code><code class="computeroutput"><span class="special">)</span></code>.
  1912. </li></ol></div>
  1913. </li>
  1914. </ol></div>
  1915. <p>
  1916. This ensures that static public function contracts are correctly checked
  1917. at run-time (static public functions do not subcontract because they have
  1918. no object <code class="computeroutput"><span class="keyword">this</span></code> and therefore
  1919. there is no inheritance, see <a class="link" href="contract_programming_overview.html#boost_contract.contract_programming_overview.public_function_calls" title="Public Function Calls">Public
  1920. Function Calls</a>).
  1921. </p>
  1922. <div class="note"><table border="0" summary="Note">
  1923. <tr>
  1924. <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td>
  1925. <th align="left">Note</th>
  1926. </tr>
  1927. <tr><td align="left" valign="top"><p>
  1928. A static public function can avoid calling <code class="computeroutput"><a class="link" href="../boost/contract/public_f_idm45394998885120.html" title="Function template public_function">boost::contract::public_function</a></code>
  1929. for efficiency but only when it has no preconditions, no postconditions,
  1930. no exception guarantees, and its class has no static invariants (the class
  1931. can still have non-static invariants or base classes instead).
  1932. </p></td></tr>
  1933. </table></div>
  1934. </div>
  1935. <div class="footnotes">
  1936. <br><hr style="width:100; text-align:left;margin-left: 0">
  1937. <div id="ftn.boost_contract.tutorial.non_member_functions.f0" class="footnote"><p><a href="#boost_contract.tutorial.non_member_functions.f0" class="para"><sup class="para">[19] </sup></a>
  1938. The name of this local variable is arbitrary, but <code class="computeroutput"><span class="identifier">c</span></code>
  1939. is often used in this documentation for <span class="quote">&#8220;<span class="quote">c</span>&#8221;</span>heck or <span class="quote">&#8220;<span class="quote">c</span>&#8221;</span>aminiti
  1940. <code class="literal">;-)</code> .
  1941. </p></div>
  1942. <div id="ftn.boost_contract.tutorial.non_member_functions.f1" class="footnote"><p><a href="#boost_contract.tutorial.non_member_functions.f1" class="para"><sup class="para">[20] </sup></a>
  1943. <span class="bold"><strong>Rationale:</strong></span> C++17 guaranteed copy elision
  1944. on function return value voids the trick this library uses to force a compile-time
  1945. error when <code class="computeroutput"><span class="keyword">auto</span></code> is incorrectly
  1946. used instead of <code class="computeroutput"><a class="link" href="../boost/contract/check.html" title="Class check">boost::contract::check</a></code>.
  1947. The library still generates a run-time error in this case (also on C++17).
  1948. In any case, after reading this documentation it should be evident to programmers
  1949. that <code class="computeroutput"><span class="keyword">auto</span></code> should not be used
  1950. in <code class="computeroutput"><a class="link" href="../boost/contract/check.html" title="Class check">boost::contract::check</a></code>
  1951. declarations so this misuse of <code class="computeroutput"><span class="keyword">auto</span></code>
  1952. should not be an issue in practice.
  1953. </p></div>
  1954. <div id="ftn.boost_contract.tutorial.preconditions.f0" class="footnote"><p><a href="#boost_contract.tutorial.preconditions.f0" class="para"><sup class="para">[21] </sup></a>
  1955. Lambda functions with no parameters can be programmed in C++11 as <code class="computeroutput"><span class="special">[...]</span> <span class="special">()</span> <span class="special">{</span> <span class="special">...</span> <span class="special">}</span></code>
  1956. but also equivalently as <code class="computeroutput"><span class="special">[...]</span> <span class="special">{</span> <span class="special">...</span> <span class="special">}</span></code>.
  1957. This second from is often used in this documentation omitting the empty
  1958. parameter list <code class="computeroutput"><span class="special">()</span></code> for brevity.
  1959. </p></div>
  1960. <div id="ftn.boost_contract.tutorial.preconditions.f1" class="footnote"><p><a href="#boost_contract.tutorial.preconditions.f1" class="para"><sup class="para">[22] </sup></a>
  1961. In this documentation preconditions often capture variables by reference
  1962. to avoid extra copies.
  1963. </p></div>
  1964. <div id="ftn.boost_contract.tutorial.return_values.f0" class="footnote"><p><a href="#boost_contract.tutorial.return_values.f0" class="para"><sup class="para">[23] </sup></a>
  1965. The name of the local variable that holds the return value is arbitrary,
  1966. but <code class="computeroutput"><span class="identifier">result</span></code> is often used
  1967. in this documentation.
  1968. </p></div>
  1969. <div id="ftn.boost_contract.tutorial.old_values.f0" class="footnote"><p><a href="#boost_contract.tutorial.old_values.f0" class="para"><sup class="para">[24] </sup></a>
  1970. The name of a local variable that holds an old value is arbitrary, but
  1971. <code class="literal">old_<span class="emphasis"><em>variable-name</em></span></code> is often used
  1972. in this documentation.
  1973. </p></div>
  1974. <div id="ftn.boost_contract.tutorial.old_values.f1" class="footnote"><p><a href="#boost_contract.tutorial.old_values.f1" class="para"><sup class="para">[25] </sup></a>
  1975. <span class="bold"><strong>Rationale:</strong></span> Old values have to be optional
  1976. values because they need to be left uninitialized when they are not used
  1977. because both postconditions and exception guarantees are disabled (defining
  1978. <code class="computeroutput"><a class="link" href="../BOOST_CO_idm45394999656032.html" title="Macro BOOST_CONTRACT_NO_POSTCONDITIONS">BOOST_CONTRACT_NO_POSTCONDITIONS</a></code>
  1979. and <code class="computeroutput"><a class="link" href="../BOOST_CONTRACT_NO_EXCEPTS.html" title="Macro BOOST_CONTRACT_NO_EXCEPTS">BOOST_CONTRACT_NO_EXCEPTS</a></code>).
  1980. That is to avoid old value copies when old values are not used, either
  1981. a pointer or (better) a <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">optional</span></code>
  1982. could have been used to achieve that. In addition, old values need to be
  1983. pointers internally allocated by this library so that they are never copied
  1984. twice even when calling an overridden function multiple times to check
  1985. preconditions, postconditions, etc. to implement subcontracting, so a smart
  1986. pointer class template was used.
  1987. </p></div>
  1988. <div id="ftn.boost_contract.tutorial.old_values.f2" class="footnote"><p><a href="#boost_contract.tutorial.old_values.f2" class="para"><sup class="para">[26] </sup></a>
  1989. For example, old value pointers might be null in preconditions when postconditions
  1990. and exception guarantees are disabled defining <code class="computeroutput"><a class="link" href="../BOOST_CO_idm45394999656032.html" title="Macro BOOST_CONTRACT_NO_POSTCONDITIONS">BOOST_CONTRACT_NO_POSTCONDITIONS</a></code>
  1991. and <code class="computeroutput"><a class="link" href="../BOOST_CONTRACT_NO_EXCEPTS.html" title="Macro BOOST_CONTRACT_NO_EXCEPTS">BOOST_CONTRACT_NO_EXCEPTS</a></code>
  1992. (but also when checking an overridden virtual public function contract
  1993. via subcontracting, etc.).
  1994. </p></div>
  1995. <div id="ftn.boost_contract.tutorial.class_invariants.f0" class="footnote"><p><a href="#boost_contract.tutorial.class_invariants.f0" class="para"><sup class="para">[27] </sup></a>
  1996. This library uses template meta-programming (SFINAE-based introspection
  1997. techniques) to check invariants only for classes that declare a member
  1998. function named by <code class="computeroutput"><a class="link" href="../BOOST_CO_idm45394999724496.html" title="Macro BOOST_CONTRACT_INVARIANT_FUNC">BOOST_CONTRACT_INVARIANT_FUNC</a></code>.
  1999. </p></div>
  2000. <div id="ftn.boost_contract.tutorial.class_invariants.f1" class="footnote"><p><a href="#boost_contract.tutorial.class_invariants.f1" class="para"><sup class="para">[28] </sup></a>
  2001. In this documentation the <code class="computeroutput"><span class="identifier">invariant</span></code>
  2002. member function is often declared <code class="computeroutput"><span class="keyword">public</span></code>
  2003. for simplicity. However, in production code it might not be acceptable
  2004. to augment the public members of a class adding the <code class="computeroutput"><span class="identifier">invariant</span></code>
  2005. function (and that can be avoided using <code class="computeroutput"><a class="link" href="../boost/contract/access.html" title="Class access">boost::contract::access</a></code>
  2006. as explained in <a class="link" href="advanced.html#boost_contract.advanced.access_specifiers" title="Access Specifiers">Access
  2007. Specifiers</a>).
  2008. </p></div>
  2009. <div id="ftn.boost_contract.tutorial.class_invariants.f2" class="footnote"><p><a href="#boost_contract.tutorial.class_invariants.f2" class="para"><sup class="para">[29] </sup></a>
  2010. This library uses template meta-programming (SFINAE-based introspection
  2011. techniques) to check static invariants only for classes that declare a
  2012. member function named by <code class="computeroutput"><a class="link" href="../BOOST_CO_idm45394999714768.html" title="Macro BOOST_CONTRACT_STATIC_INVARIANT_FUNC">BOOST_CONTRACT_STATIC_INVARIANT_FUNC</a></code>.
  2013. </p></div>
  2014. <div id="ftn.boost_contract.tutorial.class_invariants.f3" class="footnote"><p><a href="#boost_contract.tutorial.class_invariants.f3" class="para"><sup class="para">[30] </sup></a>
  2015. In this documentation the <code class="computeroutput"><span class="identifier">static_invariant</span></code>
  2016. member function is often declared <code class="computeroutput"><span class="keyword">public</span></code>
  2017. for simplicity. However, in production code it might not be acceptable
  2018. to augment the public members of a class adding the <code class="computeroutput"><span class="identifier">static_invariant</span></code>
  2019. function (and that can be avoided using <code class="computeroutput"><a class="link" href="../boost/contract/access.html" title="Class access">boost::contract::access</a></code>
  2020. as explained in <a class="link" href="advanced.html#boost_contract.advanced.access_specifiers" title="Access Specifiers">Access
  2021. Specifiers</a>).
  2022. </p></div>
  2023. <div id="ftn.boost_contract.tutorial.class_invariants.f4" class="footnote"><p><a href="#boost_contract.tutorial.class_invariants.f4" class="para"><sup class="para">[31] </sup></a>
  2024. <span class="bold"><strong>Rationale:</strong></span> In C++, it is not possible
  2025. to overload a member function based on the <code class="computeroutput"><span class="keyword">static</span></code>
  2026. classifier. Therefore, this library has to use different names for the
  2027. member functions checking non-static and static class invariants (namely
  2028. for <code class="computeroutput"><a class="link" href="../BOOST_CO_idm45394999724496.html" title="Macro BOOST_CONTRACT_INVARIANT_FUNC">BOOST_CONTRACT_INVARIANT_FUNC</a></code>
  2029. and for <code class="computeroutput"><a class="link" href="../BOOST_CO_idm45394999714768.html" title="Macro BOOST_CONTRACT_STATIC_INVARIANT_FUNC">BOOST_CONTRACT_STATIC_INVARIANT_FUNC</a></code>).
  2030. </p></div>
  2031. <div id="ftn.boost_contract.tutorial.constructors.f0" class="footnote"><p><a href="#boost_contract.tutorial.constructors.f0" class="para"><sup class="para">[32] </sup></a>
  2032. See <a class="link" href="extras.html#boost_contract.extras.no_lambda_functions__no_c__11_" title="No Lambda Functions (No C++11)">No
  2033. Lambda Functions</a> to enforce this constraint at compile-time (but
  2034. not recommended because of extra boiler-plate code).
  2035. </p></div>
  2036. <div id="ftn.boost_contract.tutorial.constructors.f1" class="footnote"><p><a href="#boost_contract.tutorial.constructors.f1" class="para"><sup class="para">[33] </sup></a>
  2037. There is a MSVC bug that was fixed in MSVC 2013 for which lambdas cannot
  2038. be used in constructor member initialization lists for templates. On MSVC
  2039. compilers with that bug, an extra (static) member function can be used
  2040. (together with <code class="computeroutput"><span class="identifier">bind</span></code> and
  2041. <code class="computeroutput"><span class="identifier">cref</span></code> as needed) to program
  2042. constructor preconditions instead of using lambdas (see <a class="link" href="extras.html#boost_contract.extras.no_lambda_functions__no_c__11_" title="No Lambda Functions (No C++11)">No
  2043. Lambda Functions</a>).
  2044. </p></div>
  2045. <div id="ftn.boost_contract.tutorial.constructors.f2" class="footnote"><p><a href="#boost_contract.tutorial.constructors.f2" class="para"><sup class="para">[34] </sup></a>
  2046. <span class="bold"><strong>Rationale:</strong></span> The <code class="computeroutput"><a class="link" href="../boost/contract/constructor_precondition.html" title="Class template constructor_precondition">boost::contract::constructor_precondition</a></code>
  2047. takes the derived class as its template parameter (using the Curiously
  2048. Recursive Template Pattern, CRTP) so the instantiated template type
  2049. is unique for each derived class. This always avoids base class ambiguity
  2050. resolution errors even when multiple inheritance is used. Note that,
  2051. as already mentioned, virtual inheritance could not be used instead
  2052. of the template parameter here to resolve ambiguities (because virtual
  2053. bases are initialized only once by the outer-most derived class, and
  2054. that would not allow to properly check preconditions of all base classes).
  2055. </p></div>
  2056. <div id="ftn.boost_contract.tutorial.constructors.f3" class="footnote"><p><a href="#boost_contract.tutorial.constructors.f3" class="para"><sup class="para">[35] </sup></a>
  2057. See <a class="link" href="extras.html#boost_contract.extras.no_lambda_functions__no_c__11_" title="No Lambda Functions (No C++11)">No
  2058. Lambda Functions</a> to enforce this constraint at compile-time (but
  2059. not recommended because of extra boiler-plate code).
  2060. </p></div>
  2061. <div id="ftn.boost_contract.tutorial.constructors.f4" class="footnote"><p><a href="#boost_contract.tutorial.constructors.f4" class="para"><sup class="para">[36] </sup></a>
  2062. See <a class="link" href="extras.html#boost_contract.extras.no_lambda_functions__no_c__11_" title="No Lambda Functions (No C++11)">No
  2063. Lambda Functions</a> to enforce these constraints at compile-time (but
  2064. not recommended because of extra boiler-plate code).
  2065. </p></div>
  2066. <div id="ftn.boost_contract.tutorial.destructors.f0" class="footnote"><p><a href="#boost_contract.tutorial.destructors.f0" class="para"><sup class="para">[37] </sup></a>
  2067. See <a class="link" href="extras.html#boost_contract.extras.no_lambda_functions__no_c__11_" title="No Lambda Functions (No C++11)">No
  2068. Lambda Functions</a> to enforce this constraint at compile-time (but
  2069. not recommended because of extra boiler-plate code).
  2070. </p></div>
  2071. <div id="ftn.boost_contract.tutorial.destructors.f1" class="footnote"><p><a href="#boost_contract.tutorial.destructors.f1" class="para"><sup class="para">[38] </sup></a>
  2072. Exceptions guarantees in destructors can access both the object <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> and
  2073. its old value because the object existed before executing the destructor
  2074. body and it still exists given the destructor body failed throwing an exception
  2075. so technically the object should still be properly constructed and satisfy
  2076. its class invariants.
  2077. </p></div>
  2078. <div id="ftn.boost_contract.tutorial.virtual_public_functions.f0" class="footnote"><p><a href="#boost_contract.tutorial.virtual_public_functions.f0" class="para"><sup class="para">[39] </sup></a>
  2079. The name of this extra parameter is arbitrary, but <code class="computeroutput"><span class="identifier">v</span></code>
  2080. is often used in this documentation.
  2081. </p></div>
  2082. <div id="ftn.boost_contract.tutorial.virtual_public_functions.f1" class="footnote"><p><a href="#boost_contract.tutorial.virtual_public_functions.f1" class="para"><sup class="para">[40] </sup></a>
  2083. <span class="bold"><strong>Rationale:</strong></span> The <code class="computeroutput"><a class="link" href="../boost/contract/virtual_.html" title="Class virtual_">boost::contract::virtual_</a></code><code class="computeroutput"><span class="special">*</span></code> parameter is used by this library to determine
  2084. that a function is virtual (in C++ it is not possible to introspect if
  2085. a function is declared <code class="computeroutput"><span class="keyword">virtual</span></code>).
  2086. Furthermore, this parameter is internally used by this library to implement
  2087. subcontracting (specifically to pass result and old values that are evaluated
  2088. by the overriding function to the contracts of overridden virtual functions
  2089. in base classes, and also to check preconditions, postconditions, and exception
  2090. guarantees of overridden virtual functions in <a class="link" href="contract_programming_overview.html#or_anchor"><code class="literal"><span class="emphasis"><em>OR</em></span></code></a>
  2091. and <a class="link" href="contract_programming_overview.html#and_anchor"><code class="literal"><span class="emphasis"><em>AND</em></span></code></a>
  2092. with contracts of the overriding virtual function).
  2093. </p></div>
  2094. <div id="ftn.boost_contract.tutorial.virtual_public_functions.f2" class="footnote"><p><a href="#boost_contract.tutorial.virtual_public_functions.f2" class="para"><sup class="para">[41] </sup></a>
  2095. <span class="bold"><strong>Rationale:</strong></span> The extra function result parameter
  2096. taken by the functor passed to <code class="computeroutput"><span class="special">.</span><span class="identifier">postcondition</span><span class="special">(...)</span></code>
  2097. is used by this library to pass the return value evaluated by the overriding
  2098. function to all its overridden virtual functions to support subcontracting.
  2099. </p></div>
  2100. <div id="ftn.boost_contract.tutorial.virtual_public_functions.f3" class="footnote"><p><a href="#boost_contract.tutorial.virtual_public_functions.f3" class="para"><sup class="para">[42] </sup></a>
  2101. <span class="bold"><strong>Rationale:</strong></span> This library does not require
  2102. programmers to specify the function type when using <code class="computeroutput"><a class="link" href="../boost/contract/public_f_idm45394998885120.html" title="Function template public_function">boost::contract::public_function</a></code>
  2103. for non-overriding virtual public functions. Therefore, this library
  2104. does not know if the enclosing function has a non-void return type so
  2105. it cannot check if the return value reference is passed as required for
  2106. non-overriding virtual public functions. Instead the function type is
  2107. passed to this library for virtual public function overrides and that
  2108. also allows this library to give a compile-time error if the return value
  2109. reference is missing in those cases.
  2110. </p></div>
  2111. <div id="ftn.boost_contract.tutorial.public_function_overrides__subcontracting_.f0" class="footnote"><p><a href="#boost_contract.tutorial.public_function_overrides__subcontracting_.f0" class="para"><sup class="para">[43] </sup></a>
  2112. In this documentation, function overrides are often marked with the code
  2113. comment <code class="computeroutput"><span class="comment">/* override */</span></code>. On
  2114. compilers that support C++11 virtual specifiers, the <code class="computeroutput"><span class="identifier">override</span></code>
  2115. identifier can be used instead (<code class="computeroutput"><span class="identifier">override</span></code>
  2116. is not used in the documentation simply because virtual specifiers are
  2117. not widely supported yet, even by compilers that support C++11 lambda functions).
  2118. </p></div>
  2119. <div id="ftn.boost_contract.tutorial.public_function_overrides__subcontracting_.f1" class="footnote"><p><a href="#boost_contract.tutorial.public_function_overrides__subcontracting_.f1" class="para"><sup class="para">[44] </sup></a>
  2120. The compile-time error generated by the library in this case is similar
  2121. in principle to the error generated by the C++11 <code class="computeroutput"><span class="identifier">override</span></code>
  2122. specifier, but it is limited to functions with the extra <code class="computeroutput"><a class="link" href="../boost/contract/virtual_.html" title="Class virtual_">boost::contract::virtual_</a></code><code class="computeroutput"><span class="special">*</span></code> parameter and searched recursively only
  2123. in <code class="computeroutput"><span class="keyword">public</span></code> base classes passed
  2124. to <code class="computeroutput"><a class="link" href="../BOOST_CONTRACT_BASE_TYPES.html" title="Macro BOOST_CONTRACT_BASE_TYPES">BOOST_CONTRACT_BASE_TYPES</a></code>
  2125. because only those are considered for subcontracting.
  2126. </p></div>
  2127. <div id="ftn.boost_contract.tutorial.public_function_overrides__subcontracting_.f2" class="footnote"><p><a href="#boost_contract.tutorial.public_function_overrides__subcontracting_.f2" class="para"><sup class="para">[45] </sup></a>
  2128. There is no equivalent of <code class="computeroutput"><a class="link" href="../BOOST_CO_idm45394998912688.html" title="Macro BOOST_CONTRACT_NAMED_OVERRIDE">BOOST_CONTRACT_NAMED_OVERRIDE</a></code>
  2129. that operates on multiple function names at once (<code class="computeroutput"><a class="link" href="../BOOST_CO_idm45394998912688.html" title="Macro BOOST_CONTRACT_NAMED_OVERRIDE">BOOST_CONTRACT_NAMED_OVERRIDE</a></code>
  2130. is not expected to be used often so it can simply be repeated multiple
  2131. times when needed).
  2132. </p></div>
  2133. <div id="ftn.boost_contract.tutorial.public_function_overrides__subcontracting_.f3" class="footnote"><p><a href="#boost_contract.tutorial.public_function_overrides__subcontracting_.f3" class="para"><sup class="para">[46] </sup></a>
  2134. <span class="bold"><strong>Rationale:</strong></span> The object <code class="computeroutput"><span class="keyword">this</span></code>
  2135. is passed after the function pointer to follow <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bind</span></code>'s
  2136. syntax. The function pointer and references to all function arguments are
  2137. needed for public function overrides because this library has to internally
  2138. call overridden virtual public functions to check their contracts for subcontracting
  2139. (even if this library will not actually execute the bodies of the overridden
  2140. functions).
  2141. </p></div>
  2142. <div id="ftn.boost_contract.tutorial.public_function_overrides__subcontracting_.f4" class="footnote"><p><a href="#boost_contract.tutorial.public_function_overrides__subcontracting_.f4" class="para"><sup class="para">[47] </sup></a>
  2143. <span class="bold"><strong>Rationale:</strong></span> As for non-overriding virtual
  2144. public functions, also public function overrides use the extra return value
  2145. parameter to pass it to the overridden functions when subcontracting. In
  2146. the case of public function overrides, this library has the function pointer
  2147. so it will generate a compile-time error if the function is non-void and
  2148. programmers forget to specify the extra return value parameter (this extra
  2149. error checking is not possible instead for non-overriding virtual public
  2150. functions because their contracts do not take the function pointer as a
  2151. parameter, see <a class="link" href="tutorial.html#boost_contract.tutorial.virtual_public_functions" title="Virtual Public Functions">Virtual
  2152. Public Functions</a>).
  2153. </p></div>
  2154. <div id="ftn.boost_contract.tutorial.public_function_overrides__subcontracting_.f5" class="footnote"><p><a href="#boost_contract.tutorial.public_function_overrides__subcontracting_.f5" class="para"><sup class="para">[48] </sup></a>
  2155. <span class="bold"><strong>Rationale:</strong></span> The <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">bad_any_cast</span></code>
  2156. exception was not used here because it does not print the from- and to-
  2157. type names (so it is not descriptive enough).
  2158. </p></div>
  2159. <div id="ftn.boost_contract.tutorial.base_classes__subcontracting_.f0" class="footnote"><p><a href="#boost_contract.tutorial.base_classes__subcontracting_.f0" class="para"><sup class="para">[49] </sup></a>
  2160. The name of this local macro is arbitrary, but <code class="computeroutput"><span class="identifier">BASES</span></code>
  2161. is often used in this documentation.
  2162. </p></div>
  2163. <div id="ftn.boost_contract.tutorial.base_classes__subcontracting_.f1" class="footnote"><p><a href="#boost_contract.tutorial.base_classes__subcontracting_.f1" class="para"><sup class="para">[50] </sup></a>
  2164. <span class="bold"><strong>Rationale:</strong></span> This library explicitly requires
  2165. the inheritance access level because derived classes must subcontract
  2166. only from public bases, but not from protected or private bases (see
  2167. <a class="link" href="contract_programming_overview.html#boost_contract.contract_programming_overview.public_function_calls" title="Public Function Calls">Public
  2168. Function Calls</a>). <code class="computeroutput"><a class="link" href="../BOOST_CONTRACT_BASE_TYPES.html" title="Macro BOOST_CONTRACT_BASE_TYPES">BOOST_CONTRACT_BASE_TYPES</a></code>
  2169. inspects each inheritance access level using preprocessor meta-programming
  2170. and removes non-public bases from the list of bases internally used for
  2171. subcontracting. However, this library cannot always detect when programmers
  2172. forget to specify the inheritance access level because, when commas are
  2173. used to separate template parameters passed to base classes, the preprocessor
  2174. will not be able to correctly use commas to identify the next base class
  2175. token in the inheritance list (the preprocessor cannot distinguish between
  2176. commas that are not protected by round parenthesis, like the ones used
  2177. in templates). Therefore, this library uses the inheritance access level
  2178. keyword <code class="computeroutput"><span class="keyword">public</span></code>, <code class="computeroutput"><span class="keyword">protected</span></code>, or <code class="computeroutput"><span class="keyword">private</span></code>
  2179. instead of commas <code class="computeroutput"><span class="special">,</span></code> for
  2180. the preprocessor to correctly find the next base class token in the inheritance
  2181. list (thus inheritance access levels must always be explicit specified
  2182. by programmers for each base).
  2183. </p></div>
  2184. <div id="ftn.boost_contract.tutorial.base_classes__subcontracting_.f2" class="footnote"><p><a href="#boost_contract.tutorial.base_classes__subcontracting_.f2" class="para"><sup class="para">[51] </sup></a>
  2185. In this documentation the <code class="computeroutput"><span class="identifier">base_type</span></code>
  2186. member type is often declared <code class="computeroutput"><span class="keyword">public</span></code>
  2187. for simplicity. However, in production code it might not be acceptable
  2188. to augment the public members of a class adding the <code class="computeroutput"><span class="identifier">base_types</span></code>
  2189. type (and that can be avoided using <code class="computeroutput"><a class="link" href="../boost/contract/access.html" title="Class access">boost::contract::access</a></code>
  2190. as explained in <a class="link" href="advanced.html#boost_contract.advanced.access_specifiers" title="Access Specifiers">Access
  2191. Specifiers</a>).
  2192. </p></div>
  2193. </div>
  2194. </div>
  2195. <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
  2196. <td align="left"></td>
  2197. <td align="right"><div class="copyright-footer">Copyright &#169; 2008-2019 Lorenzo Caminiti<p>
  2198. Distributed under the Boost Software License, Version 1.0 (see accompanying
  2199. file LICENSE_1_0.txt or a copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
  2200. </p>
  2201. </div></td>
  2202. </tr></table>
  2203. <hr>
  2204. <div class="spirit-nav">
  2205. <a accesskey="p" href="contract_programming_overview.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="advanced.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
  2206. </div>
  2207. </body>
  2208. </html>