static-constructor.html 8.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  2. <html><meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  3. <title>Phase 2 construction - Boost.Outcome documentation</title>
  4. <link rel="stylesheet" href="../../../css/boost.css" type="text/css">
  5. <meta name="generator" content="Hugo 0.52 with Boostdoc theme">
  6. <meta name="viewport" content="width=device-width,initial-scale=1.0"/>
  7. <link rel="icon" href="../../../images/favicon.ico" type="image/ico"/>
  8. <body><div class="spirit-nav">
  9. <a accesskey="p" href="../../../tutorial/advanced/constructors/file_handle.html"><img src="../../../images/prev.png" alt="Prev"></a>
  10. <a accesskey="u" href="../../../tutorial/advanced/constructors.html"><img src="../../../images/up.png" alt="Up"></a>
  11. <a accesskey="h" href="../../../index.html"><img src="../../../images/home.png" alt="Home"></a><a accesskey="n" href="../../../tutorial/advanced/constructors/metaprogrammg1.html"><img src="../../../images/next.png" alt="Next"></a></div><div id="content">
  12. <div class="titlepage"><div><div><h1 style="clear: both">Phase 2 construction</h1></div></div></div>
  13. <p>Its phase 2 constructor:</p>
  14. <div class="code-snippet"><div class="highlight"><pre class="chroma"><code class="language-c++" data-lang="c++"><span class="c1">// Phase 2 static member constructor function, which cannot throw
  15. </span><span class="c1"></span><span class="kr">inline</span> <span class="n">outcome</span><span class="o">::</span><span class="n">result</span><span class="o">&lt;</span><span class="n">file_handle</span><span class="o">&gt;</span> <span class="n">file_handle</span><span class="o">::</span><span class="n">file</span><span class="p">(</span><span class="n">file_handle</span><span class="o">::</span><span class="n">path_type</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_handle</span><span class="o">::</span><span class="n">mode</span> <span class="n">mode</span><span class="p">)</span> <span class="k">noexcept</span>
  16. <span class="p">{</span>
  17. <span class="c1">// Perform phase 1 of object construction
  18. </span><span class="c1"></span> <span class="n">file_handle</span> <span class="n">ret</span><span class="p">;</span>
  19. <span class="c1">// Perform phase 2 of object construction
  20. </span><span class="c1"></span> <span class="kt">int</span> <span class="n">flags</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
  21. <span class="k">switch</span><span class="p">(</span><span class="n">mode</span><span class="p">)</span>
  22. <span class="p">{</span>
  23. <span class="k">case</span> <span class="n">mode</span><span class="o">::</span><span class="nl">attr_read</span><span class="p">:</span>
  24. <span class="k">case</span> <span class="n">mode</span><span class="o">::</span><span class="nl">read</span><span class="p">:</span>
  25. <span class="n">flags</span> <span class="o">=</span> <span class="n">O_RDONLY</span><span class="p">;</span>
  26. <span class="k">break</span><span class="p">;</span>
  27. <span class="k">case</span> <span class="n">mode</span><span class="o">::</span><span class="nl">attr_write</span><span class="p">:</span>
  28. <span class="k">case</span> <span class="n">mode</span><span class="o">::</span><span class="nl">write</span><span class="p">:</span>
  29. <span class="n">flags</span> <span class="o">=</span> <span class="n">O_RDWR</span><span class="p">;</span>
  30. <span class="k">break</span><span class="p">;</span>
  31. <span class="k">case</span> <span class="n">mode</span><span class="o">::</span><span class="nl">append</span><span class="p">:</span>
  32. <span class="n">flags</span> <span class="o">=</span> <span class="n">O_APPEND</span><span class="p">;</span>
  33. <span class="k">break</span><span class="p">;</span>
  34. <span class="k">default</span><span class="o">:</span>
  35. <span class="k">return</span> <span class="n">std</span><span class="o">::</span><span class="n">errc</span><span class="o">::</span><span class="n">invalid_argument</span><span class="p">;</span>
  36. <span class="p">}</span>
  37. <span class="n">ret</span><span class="p">.</span><span class="n">_fd</span> <span class="o">=</span> <span class="o">::</span><span class="n">open</span><span class="p">(</span><span class="n">path</span><span class="p">.</span><span class="n">u8string</span><span class="p">().</span><span class="n">c_str</span><span class="p">(),</span> <span class="n">flags</span><span class="p">);</span>
  38. <span class="k">if</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span> <span class="o">==</span> <span class="n">ret</span><span class="p">.</span><span class="n">_fd</span><span class="p">)</span>
  39. <span class="p">{</span>
  40. <span class="c1">// Note that if we bail out here, ~file_handle() will correctly not call ::close()
  41. </span><span class="c1"></span> <span class="k">return</span> <span class="p">{</span><span class="n">errno</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">system_category</span><span class="p">()};</span>
  42. <span class="p">}</span>
  43. <span class="k">if</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span> <span class="o">==</span> <span class="o">::</span><span class="n">fstat</span><span class="p">(</span><span class="n">ret</span><span class="p">.</span><span class="n">_fd</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">ret</span><span class="p">.</span><span class="n">_stat</span><span class="p">))</span>
  44. <span class="p">{</span>
  45. <span class="c1">// Note that if we bail out here, ~file_handle() will correctly call ::close()
  46. </span><span class="c1"></span> <span class="k">return</span> <span class="p">{</span><span class="n">errno</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">system_category</span><span class="p">()};</span>
  47. <span class="p">}</span>
  48. <span class="c1">// Returning ret directly is an area full of compiler specific behaviour quirks,
  49. </span><span class="c1"></span> <span class="c1">// so be explicit by wrapping into an initialiser list with embedded move.
  50. </span><span class="c1"></span> <span class="k">return</span> <span class="p">{</span><span class="n">std</span><span class="o">::</span><span class="n">move</span><span class="p">(</span><span class="n">ret</span><span class="p">)};</span>
  51. <span class="p">}</span>
  52. </code></pre></div><a href="https://github.com/boostorg/outcome/tree/master/doc/src/snippets/constructors.cpp#L109" class="code-snippet-url" target="_blank">View this code on Github</a></div>
  53. <p>The static member function implementing phase 2 firstly calls phase 1
  54. which puts the object into a legally destructible state. We then
  55. proceed to implement phase 2 of construction, filling in the various
  56. parts as we go, reporting via <code>result</code> any failures.</p>
  57. <div class="notices note" style="background: url('../../../images/note.png') top left no-repeat padding-box padding-box;">
  58. <div class="notices heading">note</div>
  59. <div class="notices message"><p>Remember that <code>operator new</code> has a non-throwing form, <code>new(std::nothrow)</code>.</p>
  60. </div>
  61. </div>
  62. <p>For the final return, in theory we could just <code>return ret</code> and
  63. depending on the C++ version currently in force, it might work
  64. via move, or via copy, or it might refuse to compile. You can
  65. of course type lots of boilerplate to be explicit, but this use
  66. via initialiser list is a reasonable balance of explicitness
  67. versus brevity, and it should generate minimum overhead code
  68. irrespective of compiler, C++ version, or any other factor.</p>
  69. </div><p><small>Last revised: February 08, 2019 at 22:18:08 UTC</small></p>
  70. <hr>
  71. <div class="spirit-nav">
  72. <a accesskey="p" href="../../../tutorial/advanced/constructors/file_handle.html"><img src="../../../images/prev.png" alt="Prev"></a>
  73. <a accesskey="u" href="../../../tutorial/advanced/constructors.html"><img src="../../../images/up.png" alt="Up"></a>
  74. <a accesskey="h" href="../../../index.html"><img src="../../../images/home.png" alt="Home"></a><a accesskey="n" href="../../../tutorial/advanced/constructors/metaprogrammg1.html"><img src="../../../images/next.png" alt="Next"></a></div></body>
  75. </html>