mirror of
https://github.com/boostorg/optional.git
synced 2025-07-29 12:07:21 +02:00
Updated documentation; fixed optional::swap
This commit is contained in:
@ -72,7 +72,7 @@
|
|||||||
<span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
|
<span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
|
||||||
</p>
|
</p>
|
||||||
<a name="reference_optional_constructor"></a><div class="blockquote"><blockquote class="blockquote"><p>
|
<a name="reference_optional_constructor"></a><div class="blockquote"><blockquote class="blockquote"><p>
|
||||||
<code class="computeroutput"><span class="identifier">optional</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">optional</span><span class="special">();</span></code>
|
<code class="computeroutput"><span class="identifier">optional</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">optional</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span></code>
|
||||||
</p></blockquote></div>
|
</p></blockquote></div>
|
||||||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||||||
<li class="listitem">
|
<li class="listitem">
|
||||||
@ -82,11 +82,7 @@
|
|||||||
<span class="bold"><strong>Postconditions:</strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is <span class="underline">uninitialized</span>.
|
<span class="bold"><strong>Postconditions:</strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is <span class="underline">uninitialized</span>.
|
||||||
</li>
|
</li>
|
||||||
<li class="listitem">
|
<li class="listitem">
|
||||||
<span class="bold"><strong>Throws:</strong></span> Nothing.
|
<span class="bold"><strong>Notes:</strong></span> T's default constructor <span class="underline">is not</span> called.
|
||||||
</li>
|
|
||||||
<li class="listitem">
|
|
||||||
Notes: T's default constructor <span class="underline">is not</span>
|
|
||||||
called.
|
|
||||||
</li>
|
</li>
|
||||||
<li class="listitem">
|
<li class="listitem">
|
||||||
<span class="bold"><strong>Example:</strong></span>
|
<span class="bold"><strong>Example:</strong></span>
|
||||||
@ -99,7 +95,7 @@
|
|||||||
<span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
|
<span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
|
||||||
</p>
|
</p>
|
||||||
<a name="reference_optional_constructor_none_t"></a><div class="blockquote"><blockquote class="blockquote"><p>
|
<a name="reference_optional_constructor_none_t"></a><div class="blockquote"><blockquote class="blockquote"><p>
|
||||||
<code class="computeroutput"><span class="identifier">optional</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">optional</span><span class="special">(</span> <span class="identifier">none_t</span> <span class="special">);</span></code>
|
<code class="computeroutput"><span class="identifier">optional</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">optional</span><span class="special">(</span> <span class="identifier">none_t</span> <span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span></code>
|
||||||
</p></blockquote></div>
|
</p></blockquote></div>
|
||||||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||||||
<li class="listitem">
|
<li class="listitem">
|
||||||
@ -109,9 +105,6 @@
|
|||||||
<li class="listitem">
|
<li class="listitem">
|
||||||
<span class="bold"><strong>Postconditions:</strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is <span class="underline">uninitialized</span>.
|
<span class="bold"><strong>Postconditions:</strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is <span class="underline">uninitialized</span>.
|
||||||
</li>
|
</li>
|
||||||
<li class="listitem">
|
|
||||||
<span class="bold"><strong>Throws:</strong></span> Nothing.
|
|
||||||
</li>
|
|
||||||
<li class="listitem">
|
<li class="listitem">
|
||||||
<span class="bold"><strong>Notes:</strong></span> <code class="computeroutput"><span class="identifier">T</span></code>'s
|
<span class="bold"><strong>Notes:</strong></span> <code class="computeroutput"><span class="identifier">T</span></code>'s
|
||||||
default constructor <span class="underline">is not</span> called.
|
default constructor <span class="underline">is not</span> called.
|
||||||
@ -132,12 +125,16 @@
|
|||||||
<code class="computeroutput"><span class="identifier">optional</span><span class="special"><</span><span class="identifier">T</span> </code><span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">>::</span><span class="identifier">optional</span><span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">v</span> <span class="special">)</span></code>
|
<code class="computeroutput"><span class="identifier">optional</span><span class="special"><</span><span class="identifier">T</span> </code><span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">>::</span><span class="identifier">optional</span><span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">v</span> <span class="special">)</span></code>
|
||||||
</p></blockquote></div>
|
</p></blockquote></div>
|
||||||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Requires:</strong></span> <code class="computeroutput"><span class="identifier">is_copy_constructible</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span></code>
|
||||||
|
is <code class="computeroutput"><span class="keyword">true</span></code>.
|
||||||
|
</li>
|
||||||
<li class="listitem">
|
<li class="listitem">
|
||||||
<span class="bold"><strong>Effect:</strong></span> Directly-Constructs an <code class="computeroutput"><span class="identifier">optional</span></code>.
|
<span class="bold"><strong>Effect:</strong></span> Directly-Constructs an <code class="computeroutput"><span class="identifier">optional</span></code>.
|
||||||
</li>
|
</li>
|
||||||
<li class="listitem">
|
<li class="listitem">
|
||||||
<span class="bold"><strong>Postconditions:</strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is <span class="underline">initialized</span>
|
<span class="bold"><strong>Postconditions:</strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is <span class="underline">initialized</span>
|
||||||
and its value is a<span class="emphasis"><em>copy</em></span> of <code class="computeroutput"><span class="identifier">v</span></code>.
|
and its value is a <span class="emphasis"><em>copy</em></span> of <code class="computeroutput"><span class="identifier">v</span></code>.
|
||||||
</li>
|
</li>
|
||||||
<li class="listitem">
|
<li class="listitem">
|
||||||
<span class="bold"><strong>Throws:</strong></span> Whatever <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span>
|
<span class="bold"><strong>Throws:</strong></span> Whatever <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span>
|
||||||
@ -193,6 +190,58 @@
|
|||||||
</pre>
|
</pre>
|
||||||
</li>
|
</li>
|
||||||
</ul></div>
|
</ul></div>
|
||||||
|
<p>
|
||||||
|
<span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
|
||||||
|
</p>
|
||||||
|
<a name="reference_optional_constructor_move_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
|
||||||
|
<code class="computeroutput"><span class="identifier">optional</span><span class="special"><</span><span class="identifier">T</span> </code><span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">>::</span><span class="identifier">optional</span><span class="special">(</span> <span class="identifier">T</span><span class="special">&&</span>
|
||||||
|
<span class="identifier">v</span> <span class="special">)</span></code>
|
||||||
|
</p></blockquote></div>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Requires:</strong></span> <code class="computeroutput"><span class="identifier">is_move_constructible</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span></code>
|
||||||
|
is <code class="computeroutput"><span class="keyword">true</span></code>.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Effect:</strong></span> Directly-Move-Constructs an <code class="computeroutput"><span class="identifier">optional</span></code>.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Postconditions:</strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is <span class="underline">initialized</span>
|
||||||
|
and its value is move-constructed from <code class="computeroutput"><span class="identifier">v</span></code>.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Throws:</strong></span> Whatever <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span>
|
||||||
|
<span class="identifier">T</span><span class="special">&&</span>
|
||||||
|
<span class="special">)</span></code> throws.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Notes: </strong></span> <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span>
|
||||||
|
<span class="identifier">T</span><span class="special">&&</span>
|
||||||
|
<span class="special">)</span></code> is called.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Exception Safety:</strong></span> Exceptions can only
|
||||||
|
be thrown during <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span> <span class="identifier">T</span><span class="special">&&</span> <span class="special">);</span></code>
|
||||||
|
in that case, the state of <code class="computeroutput"><span class="identifier">v</span></code>
|
||||||
|
is determined by exception safety guarantees for <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span><span class="identifier">T</span><span class="special">&&)</span></code>.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Example:</strong></span>
|
||||||
|
<pre class="programlisting"><span class="identifier">T</span> <span class="identifier">v1</span><span class="special">,</span> <span class="identifier">v2</span><span class="special">;</span>
|
||||||
|
<span class="identifier">optional</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="identifier">opt</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">v1</span><span class="special">));</span>
|
||||||
|
<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">opt</span> <span class="special">==</span> <span class="identifier">v2</span> <span class="special">)</span> <span class="special">;</span>
|
||||||
|
</pre>
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<p>
|
||||||
|
<span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
|
||||||
|
</p>
|
||||||
|
<div class="blockquote"><blockquote class="blockquote"><p>
|
||||||
|
<code class="computeroutput"><span class="identifier">optional</span><span class="special"><</span><span class="identifier">T</span><span class="special">&>::</span><span class="identifier">optional</span><span class="special">(</span> <span class="identifier">T</span><span class="special">&&</span> <span class="identifier">ref</span> <span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span></code>
|
||||||
|
</p></blockquote></div>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
|
||||||
|
<span class="bold"><strong>Notes:</strong></span> This constructor is deleted
|
||||||
|
</li></ul></div>
|
||||||
<p>
|
<p>
|
||||||
<span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
|
<span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
|
||||||
</p>
|
</p>
|
||||||
@ -229,6 +278,10 @@
|
|||||||
<code class="computeroutput"><span class="identifier">optional</span><span class="special"><</span><span class="identifier">T</span> </code><span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">>::</span><span class="identifier">optional</span><span class="special">(</span> <span class="identifier">optional</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span> <span class="special">);</span></code>
|
<code class="computeroutput"><span class="identifier">optional</span><span class="special"><</span><span class="identifier">T</span> </code><span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">>::</span><span class="identifier">optional</span><span class="special">(</span> <span class="identifier">optional</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span> <span class="special">);</span></code>
|
||||||
</p></blockquote></div>
|
</p></blockquote></div>
|
||||||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Requires:</strong></span> <code class="computeroutput"><span class="identifier">is_copy_constructible</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span></code>
|
||||||
|
is <code class="computeroutput"><span class="keyword">true</span></code>.
|
||||||
|
</li>
|
||||||
<li class="listitem">
|
<li class="listitem">
|
||||||
<span class="bold"><strong>Effect:</strong></span> Copy-Constructs an <code class="computeroutput"><span class="identifier">optional</span></code>.
|
<span class="bold"><strong>Effect:</strong></span> Copy-Constructs an <code class="computeroutput"><span class="identifier">optional</span></code>.
|
||||||
</li>
|
</li>
|
||||||
@ -320,6 +373,116 @@
|
|||||||
</pre>
|
</pre>
|
||||||
</li>
|
</li>
|
||||||
</ul></div>
|
</ul></div>
|
||||||
|
<p>
|
||||||
|
<span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
|
||||||
|
</p>
|
||||||
|
<a name="reference_optional_move_constructor_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
|
||||||
|
<code class="computeroutput"><span class="identifier">optional</span><span class="special"><</span><span class="identifier">T</span> </code><span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">>::</span><span class="identifier">optional</span><span class="special">(</span> <span class="identifier">optional</span><span class="special">&&</span> <span class="identifier">rhs</span>
|
||||||
|
<span class="special">)</span> <span class="keyword">noexcept</span><span class="special">(</span></code><span class="emphasis"><em>see below</em></span><code class="computeroutput"><span class="special">);</span></code>
|
||||||
|
</p></blockquote></div>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Requires:</strong></span> <code class="computeroutput"><span class="identifier">is_move_constructible</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span></code>
|
||||||
|
is <code class="computeroutput"><span class="keyword">true</span></code>.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Effect:</strong></span> Move-constructs an <code class="computeroutput"><span class="identifier">optional</span></code>.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Postconditions:</strong></span> If <code class="computeroutput"><span class="identifier">rhs</span></code>
|
||||||
|
is initialized, <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
|
||||||
|
is initialized and its value is move constructed from <code class="computeroutput"><span class="identifier">rhs</span></code>;
|
||||||
|
else <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
|
||||||
|
is uninitialized.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Throws:</strong></span> Whatever <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span>
|
||||||
|
<span class="identifier">T</span><span class="special">&&</span>
|
||||||
|
<span class="special">)</span></code> throws.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Notes:</strong></span> If <code class="computeroutput"><span class="identifier">rhs</span></code>
|
||||||
|
is initialized, <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span> <span class="identifier">T</span>
|
||||||
|
<span class="special">&&</span> <span class="special">)</span></code>
|
||||||
|
is called. The expression inside <code class="computeroutput"><span class="keyword">noexcept</span></code>
|
||||||
|
is equivalent to <code class="computeroutput"><span class="identifier">is_nothrow_move_constructible</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span></code>.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Exception Safety:</strong></span> Exceptions can only
|
||||||
|
be thrown during <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span> <span class="identifier">T</span><span class="special">&&</span> <span class="special">);</span></code>
|
||||||
|
in that case, <code class="computeroutput"><span class="identifier">rhs</span></code> remains
|
||||||
|
initialized and the value of <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code> is determined by exception safety
|
||||||
|
of <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span><span class="identifier">T</span><span class="special">&&)</span></code>.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Example:</strong></span>
|
||||||
|
<pre class="programlisting"><span class="identifier">optional</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">unique_ptr</span><span class="special"><</span><span class="identifier">T</span><span class="special">>></span> <span class="identifier">uninit</span> <span class="special">;</span>
|
||||||
|
<span class="identifier">assert</span> <span class="special">(!</span><span class="identifier">uninit</span><span class="special">);</span>
|
||||||
|
|
||||||
|
<span class="identifier">optional</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">unique_ptr</span><span class="special"><</span><span class="identifier">T</span><span class="special">>></span> <span class="identifier">uinit2</span> <span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">uninit</span><span class="special">)</span> <span class="special">)</span> <span class="special">;</span>
|
||||||
|
<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">uninit2</span> <span class="special">==</span> <span class="identifier">uninit</span> <span class="special">);</span>
|
||||||
|
|
||||||
|
<span class="identifier">optional</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">unique_ptr</span><span class="special"><</span><span class="identifier">T</span><span class="special">>></span> <span class="identifier">init</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">uniqye_ptr</span><span class="special"><</span><span class="identifier">T</span><span class="special">>(</span><span class="keyword">new</span> <span class="identifier">T</span><span class="special">(</span><span class="number">2</span><span class="special">))</span> <span class="special">);</span>
|
||||||
|
<span class="identifier">assert</span> <span class="special">(</span> <span class="special">**</span><span class="identifier">init</span> <span class="special">==</span> <span class="identifier">T</span><span class="special">(</span><span class="number">2</span><span class="special">)</span> <span class="special">)</span> <span class="special">;</span>
|
||||||
|
|
||||||
|
<span class="identifier">optional</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">unique_ptr</span><span class="special"><</span><span class="identifier">T</span><span class="special">>></span> <span class="identifier">init2</span> <span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">init</span><span class="special">)</span> <span class="special">)</span> <span class="special">;</span>
|
||||||
|
<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">init</span> <span class="special">);</span>
|
||||||
|
<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">init</span> <span class="special">==</span> <span class="keyword">nullptr</span> <span class="special">);</span>
|
||||||
|
<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">init2</span> <span class="special">);</span>
|
||||||
|
<span class="identifier">assert</span> <span class="special">(</span> <span class="special">**</span><span class="identifier">init2</span> <span class="special">==</span> <span class="identifier">T</span><span class="special">(</span><span class="number">2</span><span class="special">)</span> <span class="special">)</span> <span class="special">;</span>
|
||||||
|
</pre>
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<p>
|
||||||
|
<span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
|
||||||
|
</p>
|
||||||
|
<div class="blockquote"><blockquote class="blockquote"><p>
|
||||||
|
<code class="computeroutput"><span class="identifier">optional</span><span class="special"><</span><span class="identifier">T</span><span class="special">&>::</span><span class="identifier">optional</span><span class="special">(</span> <span class="identifier">optional</span> <span class="special">&&</span>
|
||||||
|
<span class="identifier">rhs</span> <span class="special">);</span></code>
|
||||||
|
</p></blockquote></div>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Effect:</strong></span> Move-Constructs an <code class="computeroutput"><span class="identifier">optional</span></code>.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Postconditions:</strong></span> If <code class="computeroutput"><span class="identifier">rhs</span></code>
|
||||||
|
is initialized, <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
|
||||||
|
is initialized and its value is another reference to the same object referenced
|
||||||
|
by <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code>;
|
||||||
|
else <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
|
||||||
|
is uninitialized.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Throws:</strong></span> Nothing.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Notes:</strong></span> If <code class="computeroutput"><span class="identifier">rhs</span></code>
|
||||||
|
is initialized, both <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
|
||||||
|
and <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code>
|
||||||
|
will reefer to the same object (they alias).
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Example:</strong></span>
|
||||||
|
<pre class="programlisting"><span class="identifier">optional</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">unique_ptr</span><span class="special"><</span><span class="identifier">T</span><span class="special">>&></span> <span class="identifier">uninit</span> <span class="special">;</span>
|
||||||
|
<span class="identifier">assert</span> <span class="special">(!</span><span class="identifier">uninit</span><span class="special">);</span>
|
||||||
|
|
||||||
|
<span class="identifier">optional</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">unique_ptr</span><span class="special"><</span><span class="identifier">T</span><span class="special">>&></span> <span class="identifier">uinit2</span> <span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">uninit</span><span class="special">)</span> <span class="special">)</span> <span class="special">;</span>
|
||||||
|
<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">uninit2</span> <span class="special">==</span> <span class="identifier">uninit</span> <span class="special">);</span>
|
||||||
|
|
||||||
|
<span class="identifier">std</span><span class="special">::</span><span class="identifier">unique_ptr</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="identifier">v</span><span class="special">(</span><span class="keyword">new</span> <span class="identifier">T</span><span class="special">(</span><span class="number">2</span><span class="special">))</span> <span class="special">;</span>
|
||||||
|
<span class="identifier">optional</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">unique_ptr</span><span class="special"><</span><span class="identifier">T</span><span class="special">>&></span> <span class="identifier">init</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span>
|
||||||
|
<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">init</span> <span class="special">==</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span>
|
||||||
|
|
||||||
|
<span class="identifier">optional</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">unique_ptr</span><span class="special"><</span><span class="identifier">T</span><span class="special">>&></span> <span class="identifier">init2</span> <span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">init</span><span class="special">)</span> <span class="special">)</span> <span class="special">;</span>
|
||||||
|
<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">init2</span> <span class="special">==</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span>
|
||||||
|
|
||||||
|
<span class="special">*</span><span class="identifier">v</span> <span class="special">=</span> <span class="number">3</span> <span class="special">;</span>
|
||||||
|
|
||||||
|
<span class="identifier">assert</span> <span class="special">(</span> <span class="special">**</span><span class="identifier">init</span> <span class="special">==</span> <span class="number">3</span> <span class="special">)</span> <span class="special">;</span>
|
||||||
|
<span class="identifier">assert</span> <span class="special">(</span> <span class="special">**</span><span class="identifier">init2</span> <span class="special">==</span> <span class="number">3</span> <span class="special">)</span> <span class="special">;</span>
|
||||||
|
</pre>
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
<p>
|
<p>
|
||||||
<span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
|
<span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
|
||||||
</p>
|
</p>
|
||||||
@ -368,6 +531,52 @@
|
|||||||
</pre>
|
</pre>
|
||||||
</li>
|
</li>
|
||||||
</ul></div>
|
</ul></div>
|
||||||
|
<p>
|
||||||
|
<span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
|
||||||
|
</p>
|
||||||
|
<a name="reference_optional_move_constructor_other_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
|
||||||
|
<code class="computeroutput"><span class="keyword">template</span><span class="special"><</span><span class="identifier">U</span><span class="special">></span> <span class="keyword">explicit</span> <span class="identifier">optional</span><span class="special"><</span><span class="identifier">T</span></code>
|
||||||
|
<span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">>::</span><span class="identifier">optional</span><span class="special">(</span> <span class="identifier">optional</span><span class="special"><</span><span class="identifier">U</span><span class="special">>&&</span>
|
||||||
|
<span class="identifier">rhs</span> <span class="special">);</span></code>
|
||||||
|
</p></blockquote></div>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Effect:</strong></span> Move-constructs an <code class="computeroutput"><span class="identifier">optional</span></code>.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Postconditions:</strong></span> If <code class="computeroutput"><span class="identifier">rhs</span></code>
|
||||||
|
is initialized, <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
|
||||||
|
is initialized and its value is move constructed from <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code>; else <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is uninitialized.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Throws:</strong></span> Whatever <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span>
|
||||||
|
<span class="identifier">U</span><span class="special">&&</span>
|
||||||
|
<span class="special">)</span></code> throws.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Notes: </strong></span> <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span>
|
||||||
|
<span class="identifier">U</span><span class="special">&&</span>
|
||||||
|
<span class="special">)</span></code> is called if <code class="computeroutput"><span class="identifier">rhs</span></code>
|
||||||
|
is initialized, which requires a valid conversion from <code class="computeroutput"><span class="identifier">U</span></code>
|
||||||
|
to <code class="computeroutput"><span class="identifier">T</span></code>.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Exception Safety:</strong></span> Exceptions can only
|
||||||
|
be thrown during <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span> <span class="identifier">U</span><span class="special">&&</span> <span class="special">);</span></code>
|
||||||
|
in that case, <code class="computeroutput"><span class="identifier">rhs</span></code> remains
|
||||||
|
initialized and the value of <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code> is determined by exception safety
|
||||||
|
guarantee of <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span> <span class="identifier">U</span><span class="special">&&</span> <span class="special">)</span></code>.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Example:</strong></span>
|
||||||
|
<pre class="programlisting"><span class="identifier">optional</span><span class="special"><</span><span class="keyword">double</span><span class="special">></span> <span class="identifier">x</span><span class="special">(</span><span class="number">123.4</span><span class="special">);</span>
|
||||||
|
<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">x</span> <span class="special">==</span> <span class="number">123.4</span> <span class="special">)</span> <span class="special">;</span>
|
||||||
|
|
||||||
|
<span class="identifier">optional</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">y</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">x</span><span class="special">))</span> <span class="special">;</span>
|
||||||
|
<span class="identifier">assert</span><span class="special">(</span> <span class="special">*</span><span class="identifier">y</span> <span class="special">==</span> <span class="number">123</span> <span class="special">)</span> <span class="special">;</span>
|
||||||
|
</pre>
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
<p>
|
<p>
|
||||||
<span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
|
<span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
|
||||||
</p>
|
</p>
|
||||||
@ -511,6 +720,66 @@
|
|||||||
</pre>
|
</pre>
|
||||||
</li>
|
</li>
|
||||||
</ul></div>
|
</ul></div>
|
||||||
|
<p>
|
||||||
|
<span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
|
||||||
|
</p>
|
||||||
|
<a name="reference_optional_operator_move_equal_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
|
||||||
|
<code class="computeroutput"><span class="identifier">optional</span><span class="special">&</span>
|
||||||
|
<span class="identifier">optional</span><span class="special"><</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">>::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">T</span><span class="special">&&</span> <span class="identifier">rhs</span>
|
||||||
|
<span class="special">)</span> <span class="special">;</span></code>
|
||||||
|
</p></blockquote></div>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Effect:</strong></span> Moves the value <code class="computeroutput"><span class="identifier">rhs</span></code> to an <code class="computeroutput"><span class="identifier">optional</span></code>.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Postconditions: </strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is initialized and its value is moved
|
||||||
|
from <code class="computeroutput"><span class="identifier">rhs</span></code>.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Throws:</strong></span> Whatever <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">T</span><span class="special">&&</span> <span class="special">)</span></code>
|
||||||
|
or <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span><span class="identifier">T</span>
|
||||||
|
<span class="special">&&)</span></code> throws.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Notes:</strong></span> If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> was initialized, <code class="computeroutput"><span class="identifier">T</span></code>'s
|
||||||
|
move-assignment operator is used, otherwise, its move-constructor is used.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Exception Safety:</strong></span> In the event of an exception,
|
||||||
|
the initialization state of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is unchanged and its value unspecified
|
||||||
|
as far as <code class="computeroutput"><span class="identifier">optional</span></code> is concerned
|
||||||
|
(it is up to <code class="computeroutput"><span class="identifier">T</span></code>'s <code class="computeroutput"><span class="keyword">operator</span><span class="special">=()</span></code>).
|
||||||
|
If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
|
||||||
|
is initially uninitialized and <code class="computeroutput"><span class="identifier">T</span></code>'s
|
||||||
|
<span class="emphasis"><em>move constructor</em></span> fails, <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is left properly uninitialized.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Example:</strong></span>
|
||||||
|
<pre class="programlisting"><span class="identifier">T</span> <span class="identifier">x</span><span class="special">;</span>
|
||||||
|
<span class="identifier">optional</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="identifier">def</span> <span class="special">;</span>
|
||||||
|
<span class="identifier">optional</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="identifier">opt</span><span class="special">(</span><span class="identifier">x</span><span class="special">)</span> <span class="special">;</span>
|
||||||
|
|
||||||
|
<span class="identifier">T</span> <span class="identifier">y1</span><span class="special">,</span> <span class="identifier">y2</span><span class="special">,</span> <span class="identifier">yR</span><span class="special">;</span>
|
||||||
|
<span class="identifier">def</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">y1</span><span class="special">)</span> <span class="special">;</span>
|
||||||
|
<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">def</span> <span class="special">==</span> <span class="identifier">yR</span> <span class="special">)</span> <span class="special">;</span>
|
||||||
|
<span class="identifier">opt</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">y2</span><span class="special">)</span> <span class="special">;</span>
|
||||||
|
<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">opt</span> <span class="special">==</span> <span class="identifier">yR</span> <span class="special">)</span> <span class="special">;</span>
|
||||||
|
</pre>
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<p>
|
||||||
|
<span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
|
||||||
|
</p>
|
||||||
|
<div class="blockquote"><blockquote class="blockquote"><p>
|
||||||
|
<code class="computeroutput"><span class="identifier">optional</span><span class="special"><</span><span class="identifier">T</span><span class="special">&>&</span>
|
||||||
|
<span class="identifier">optional</span><span class="special"><</span><span class="identifier">T</span><span class="special">&>::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">T</span><span class="special">&&</span>
|
||||||
|
<span class="identifier">rhs</span> <span class="special">)</span>
|
||||||
|
<span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span></code>
|
||||||
|
</p></blockquote></div>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
|
||||||
|
<span class="bold"><strong>Notes:</strong></span> This assignment operator is deleted.
|
||||||
|
</li></ul></div>
|
||||||
<p>
|
<p>
|
||||||
<span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
|
<span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
|
||||||
</p>
|
</p>
|
||||||
@ -613,6 +882,75 @@
|
|||||||
</pre>
|
</pre>
|
||||||
</li>
|
</li>
|
||||||
</ul></div>
|
</ul></div>
|
||||||
|
<p>
|
||||||
|
<span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
|
||||||
|
</p>
|
||||||
|
<a name="reference_optional_operator_move_equal_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
|
||||||
|
<code class="computeroutput"><span class="identifier">optional</span><span class="special">&</span>
|
||||||
|
<span class="identifier">optional</span><span class="special"><</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">>::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&&</span> <span class="identifier">rhs</span>
|
||||||
|
<span class="special">)</span> <span class="keyword">noexcept</span><span class="special">(</span></code><span class="emphasis"><em>see below</em></span><code class="computeroutput"><span class="special">);</span></code>
|
||||||
|
</p></blockquote></div>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Effect:</strong></span> Move-assigns another <code class="computeroutput"><span class="identifier">optional</span></code> to an <code class="computeroutput"><span class="identifier">optional</span></code>.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Postconditions:</strong></span> If <code class="computeroutput"><span class="identifier">rhs</span></code>
|
||||||
|
is initialized, <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
|
||||||
|
is initialized and its value is moved from <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code>, <code class="computeroutput"><span class="identifier">rhs</span></code>
|
||||||
|
remains initialized; else <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is uninitialized.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Throws:</strong></span> Whatever <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="keyword">operator</span><span class="special">(</span> <span class="identifier">T</span><span class="special">&&</span>
|
||||||
|
<span class="special">)</span></code> or <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span>
|
||||||
|
<span class="identifier">T</span> <span class="special">&&</span>
|
||||||
|
<span class="special">)</span></code> throws.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Notes:</strong></span> If both <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> and <code class="computeroutput"><span class="identifier">rhs</span></code>
|
||||||
|
are initially initialized, <code class="computeroutput"><span class="identifier">T</span></code>'s
|
||||||
|
<span class="emphasis"><em>move assignment operator</em></span> is used. If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is
|
||||||
|
initially initialized but <code class="computeroutput"><span class="identifier">rhs</span></code>
|
||||||
|
is uninitialized, <code class="computeroutput"><span class="identifier">T</span></code>'s [destructor]
|
||||||
|
is called. If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
|
||||||
|
is initially uninitialized but <code class="computeroutput"><span class="identifier">rhs</span></code>
|
||||||
|
is initialized, <code class="computeroutput"><span class="identifier">T</span></code>'s <span class="emphasis"><em>move
|
||||||
|
constructor</em></span> is called. The expression inside <code class="computeroutput"><span class="keyword">noexcept</span></code>
|
||||||
|
is equivalent to <code class="computeroutput"><span class="identifier">is_nothrow_move_constructible</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span>
|
||||||
|
<span class="special">&&</span> <span class="identifier">is_nothrow_move_assignable</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span></code>.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Exception Safety:</strong></span> In the event of an exception,
|
||||||
|
the initialization state of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is unchanged and its value unspecified
|
||||||
|
as far as optional is concerned (it is up to <code class="computeroutput"><span class="identifier">T</span></code>'s
|
||||||
|
<code class="computeroutput"><span class="keyword">operator</span><span class="special">=()</span></code>).
|
||||||
|
If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
|
||||||
|
is initially uninitialized and <code class="computeroutput"><span class="identifier">T</span></code>'s
|
||||||
|
<span class="emphasis"><em>move constructor</em></span> fails, <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is left properly uninitialized.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Example:</strong></span>
|
||||||
|
<pre class="programlisting"><span class="identifier">optional</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="identifier">opt</span><span class="special">(</span><span class="identifier">T</span><span class="special">(</span><span class="number">2</span><span class="special">))</span> <span class="special">;</span>
|
||||||
|
<span class="identifier">optional</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="identifier">def</span> <span class="special">;</span>
|
||||||
|
|
||||||
|
<span class="identifier">opt</span> <span class="special">=</span> <span class="identifier">def</span> <span class="special">;</span>
|
||||||
|
<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">def</span> <span class="special">)</span> <span class="special">;</span>
|
||||||
|
<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">opt</span> <span class="special">)</span> <span class="special">;</span>
|
||||||
|
<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">opt</span> <span class="special">==</span> <span class="identifier">T</span><span class="special">(</span><span class="number">2</span><span class="special">)</span> <span class="special">)</span> <span class="special">;</span>
|
||||||
|
</pre>
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<p>
|
||||||
|
<span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
|
||||||
|
</p>
|
||||||
|
<div class="blockquote"><blockquote class="blockquote"><p>
|
||||||
|
<code class="computeroutput"><span class="identifier">optional</span><span class="special"><</span><span class="identifier">T</span><span class="special">&></span> <span class="special">&</span> <span class="identifier">optional</span><span class="special"><</span><span class="identifier">T</span><span class="special">&>::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special"><</span><span class="identifier">T</span><span class="special">&>&&</span>
|
||||||
|
<span class="identifier">rhs</span> <span class="special">)</span>
|
||||||
|
<span class="special">;</span></code>
|
||||||
|
</p></blockquote></div>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
|
||||||
|
<span class="bold"><strong>Effect:</strong></span> Same as <code class="computeroutput"><span class="identifier">optional</span><span class="special"><</span><span class="identifier">T</span><span class="special">&>::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special"><</span><span class="identifier">T</span><span class="special">&></span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span> <span class="special">)</span></code>.
|
||||||
|
</li></ul></div>
|
||||||
<p>
|
<p>
|
||||||
<span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
|
<span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
|
||||||
</p>
|
</p>
|
||||||
@ -673,6 +1011,59 @@
|
|||||||
</pre>
|
</pre>
|
||||||
</li>
|
</li>
|
||||||
</ul></div>
|
</ul></div>
|
||||||
|
<p>
|
||||||
|
<span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
|
||||||
|
</p>
|
||||||
|
<a name="reference_optional_operator_move_equal_other_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
|
||||||
|
<code class="computeroutput"><span class="keyword">template</span><span class="special"><</span><span class="identifier">U</span><span class="special">></span> <span class="identifier">optional</span><span class="special">&</span>
|
||||||
|
<span class="identifier">optional</span><span class="special"><</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">>::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special"><</span><span class="identifier">U</span><span class="special">>&&</span>
|
||||||
|
<span class="identifier">rhs</span> <span class="special">)</span>
|
||||||
|
<span class="special">;</span></code>
|
||||||
|
</p></blockquote></div>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Effect:</strong></span> Move-assigns another convertible
|
||||||
|
optional to an optional.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Postconditions:</strong></span> If <code class="computeroutput"><span class="identifier">rhs</span></code>
|
||||||
|
is initialized, <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
|
||||||
|
is initialized and its value is moved from the value of <code class="computeroutput"><span class="identifier">rhs</span></code>;
|
||||||
|
else <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
|
||||||
|
is uninitialized.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Throws:</strong></span> Whatever <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">U</span><span class="special">&&</span> <span class="special">)</span></code>
|
||||||
|
or <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span> <span class="identifier">U</span><span class="special">&&</span> <span class="special">)</span></code>
|
||||||
|
throws.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Notes:</strong></span> If both <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> and <code class="computeroutput"><span class="identifier">rhs</span></code>
|
||||||
|
are initially initialized, <code class="computeroutput"><span class="identifier">T</span></code>'s
|
||||||
|
<span class="emphasis"><em>assignment operator</em></span> (from <code class="computeroutput"><span class="identifier">U</span><span class="special">&&</span></code>) is used. If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is initially initialized but <code class="computeroutput"><span class="identifier">rhs</span></code> is uninitialized, <code class="computeroutput"><span class="identifier">T</span></code>'s
|
||||||
|
<span class="emphasis"><em>destructor</em></span> is called. If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is initially uninitialized but <code class="computeroutput"><span class="identifier">rhs</span></code> is initialized, <code class="computeroutput"><span class="identifier">T</span></code>'s
|
||||||
|
<span class="emphasis"><em>converting constructor</em></span> (from <code class="computeroutput"><span class="identifier">U</span><span class="special">&&</span></code>) is called.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Exception Safety:</strong></span> In the event of an exception,
|
||||||
|
the initialization state of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is unchanged and its value unspecified
|
||||||
|
as far as optional is concerned (it is up to <code class="computeroutput"><span class="identifier">T</span></code>'s
|
||||||
|
<code class="computeroutput"><span class="keyword">operator</span><span class="special">=()</span></code>).
|
||||||
|
If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
|
||||||
|
is initially uninitialized and <code class="computeroutput"><span class="identifier">T</span></code>'s
|
||||||
|
converting constructor fails, <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is left properly uninitialized.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Example:</strong></span>
|
||||||
|
<pre class="programlisting"><span class="identifier">T</span> <span class="identifier">v</span><span class="special">;</span>
|
||||||
|
<span class="identifier">optional</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="identifier">opt0</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span>
|
||||||
|
<span class="identifier">optional</span><span class="special"><</span><span class="identifier">U</span><span class="special">></span> <span class="identifier">opt1</span><span class="special">;</span>
|
||||||
|
|
||||||
|
<span class="identifier">opt1</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">opt0</span><span class="special">)</span> <span class="special">;</span>
|
||||||
|
<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">opt1</span> <span class="special">==</span> <span class="keyword">static_cast</span><span class="special"><</span><span class="identifier">U</span><span class="special">>(</span><span class="identifier">v</span><span class="special">)</span> <span class="special">)</span> <span class="special">;</span>
|
||||||
|
</pre>
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
<p>
|
<p>
|
||||||
<span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
|
<span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
|
||||||
</p>
|
</p>
|
||||||
@ -768,7 +1159,7 @@
|
|||||||
</p></blockquote></div>
|
</p></blockquote></div>
|
||||||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||||||
<li class="listitem">
|
<li class="listitem">
|
||||||
<span class="bold"><strong>Requirements:</strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is initialized
|
<span class="bold"><strong>Requires:</strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is initialized
|
||||||
</li>
|
</li>
|
||||||
<li class="listitem">
|
<li class="listitem">
|
||||||
<span class="bold"><strong>Returns:</strong></span> A reference to the contained
|
<span class="bold"><strong>Returns:</strong></span> A reference to the contained
|
||||||
@ -870,7 +1261,7 @@
|
|||||||
</p></blockquote></div>
|
</p></blockquote></div>
|
||||||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||||||
<li class="listitem">
|
<li class="listitem">
|
||||||
<span class="bold"><strong>Requirements: </strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is initialized
|
<span class="bold"><strong>Requires: </strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is initialized
|
||||||
</li>
|
</li>
|
||||||
<li class="listitem">
|
<li class="listitem">
|
||||||
<span class="bold"><strong>Returns:</strong></span> <span class="underline">The</span>
|
<span class="bold"><strong>Returns:</strong></span> <span class="underline">The</span>
|
||||||
@ -956,7 +1347,7 @@
|
|||||||
</p></blockquote></div>
|
</p></blockquote></div>
|
||||||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||||||
<li class="listitem">
|
<li class="listitem">
|
||||||
<span class="bold"><strong>Requirements: </strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is initialized.
|
<span class="bold"><strong>Requires: </strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is initialized.
|
||||||
</li>
|
</li>
|
||||||
<li class="listitem">
|
<li class="listitem">
|
||||||
<span class="bold"><strong>Returns:</strong></span> A pointer to the contained value.
|
<span class="bold"><strong>Returns:</strong></span> A pointer to the contained value.
|
||||||
@ -1005,16 +1396,13 @@
|
|||||||
<span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
|
<span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
|
||||||
</p>
|
</p>
|
||||||
<a name="reference_optional_operator_not"></a><div class="blockquote"><blockquote class="blockquote"><p>
|
<a name="reference_optional_operator_not"></a><div class="blockquote"><blockquote class="blockquote"><p>
|
||||||
<code class="computeroutput"><span class="keyword">bool</span> <span class="identifier">optional</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="keyword">operator</span><span class="special">!()</span> <span class="special">;</span></code>
|
<code class="computeroutput"><span class="keyword">bool</span> <span class="identifier">optional</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="keyword">operator</span><span class="special">!()</span> <span class="keyword">noexcept</span> <span class="special">;</span></code>
|
||||||
</p></blockquote></div>
|
</p></blockquote></div>
|
||||||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||||||
<li class="listitem">
|
<li class="listitem">
|
||||||
<span class="bold"><strong>Returns:</strong></span> If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is uninitialized, <code class="computeroutput"><span class="keyword">true</span></code>;
|
<span class="bold"><strong>Returns:</strong></span> If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is uninitialized, <code class="computeroutput"><span class="keyword">true</span></code>;
|
||||||
else <code class="computeroutput"><span class="keyword">false</span></code>.
|
else <code class="computeroutput"><span class="keyword">false</span></code>.
|
||||||
</li>
|
</li>
|
||||||
<li class="listitem">
|
|
||||||
<span class="bold"><strong>Throws:</strong></span> Nothing.
|
|
||||||
</li>
|
|
||||||
<li class="listitem">
|
<li class="listitem">
|
||||||
<span class="bold"><strong>Notes:</strong></span> This operator is provided for those
|
<span class="bold"><strong>Notes:</strong></span> This operator is provided for those
|
||||||
compilers which can't use the <span class="emphasis"><em>unspecified-bool-type operator</em></span>
|
compilers which can't use the <span class="emphasis"><em>unspecified-bool-type operator</em></span>
|
||||||
@ -1288,7 +1676,7 @@
|
|||||||
<a name="reference_swap_optional_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
|
<a name="reference_swap_optional_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
|
||||||
<code class="computeroutput"><span class="keyword">void</span> <span class="identifier">swap</span>
|
<code class="computeroutput"><span class="keyword">void</span> <span class="identifier">swap</span>
|
||||||
<span class="special">(</span> <span class="identifier">optional</span><span class="special"><</span><span class="identifier">T</span><span class="special">>&</span>
|
<span class="special">(</span> <span class="identifier">optional</span><span class="special"><</span><span class="identifier">T</span><span class="special">>&</span>
|
||||||
<span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special"><</span><span class="identifier">T</span><span class="special">>&</span> <span class="identifier">y</span> <span class="special">);</span></code>
|
<span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special"><</span><span class="identifier">T</span><span class="special">>&</span> <span class="identifier">y</span> <span class="special">)</span> <span class="special">;</span></code>
|
||||||
</p></blockquote></div>
|
</p></blockquote></div>
|
||||||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||||||
<li class="listitem">
|
<li class="listitem">
|
||||||
@ -1305,19 +1693,21 @@
|
|||||||
<li class="listitem">
|
<li class="listitem">
|
||||||
<span class="bold"><strong>Throws:</strong></span> If both are initialized, whatever
|
<span class="bold"><strong>Throws:</strong></span> If both are initialized, whatever
|
||||||
<code class="computeroutput"><span class="identifier">swap</span><span class="special">(</span><span class="identifier">T</span><span class="special">&,</span><span class="identifier">T</span><span class="special">&)</span></code>
|
<code class="computeroutput"><span class="identifier">swap</span><span class="special">(</span><span class="identifier">T</span><span class="special">&,</span><span class="identifier">T</span><span class="special">&)</span></code>
|
||||||
throws. If only one is initialized, whatever <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span> <span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="special">)</span></code> throws.
|
throws. If only one is initialized, whatever <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span> <span class="special">(</span> <span class="identifier">T</span><span class="special">&&</span>
|
||||||
|
<span class="special">)</span></code> throws.
|
||||||
</li>
|
</li>
|
||||||
<li class="listitem">
|
<li class="listitem">
|
||||||
<span class="bold"><strong>Notes:</strong></span> If both are initialized, <code class="computeroutput"><span class="identifier">swap</span><span class="special">(</span><span class="identifier">T</span><span class="special">&,</span><span class="identifier">T</span><span class="special">&)</span></code>
|
<span class="bold"><strong>Notes:</strong></span> If both are initialized, <code class="computeroutput"><span class="identifier">swap</span><span class="special">(</span><span class="identifier">T</span><span class="special">&,</span><span class="identifier">T</span><span class="special">&)</span></code>
|
||||||
is used unqualified but with <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">swap</span></code>
|
is used unqualified but with <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">swap</span></code>
|
||||||
introduced in scope. If only one is initialized, <code class="computeroutput"><span class="identifier">T</span><span class="special">::~</span><span class="identifier">T</span><span class="special">()</span></code> and <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span>
|
introduced in scope. If only one is initialized, <code class="computeroutput"><span class="identifier">T</span><span class="special">::~</span><span class="identifier">T</span><span class="special">()</span></code> and <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span>
|
||||||
<span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="special">)</span></code>
|
<span class="identifier">T</span><span class="special">&&</span>
|
||||||
is called.
|
<span class="special">)</span></code> is called.
|
||||||
</li>
|
</li>
|
||||||
<li class="listitem">
|
<li class="listitem">
|
||||||
<span class="bold"><strong>Exception Safety:</strong></span> If both are initialized,
|
<span class="bold"><strong>Exception Safety:</strong></span> If both are initialized,
|
||||||
this operation has the exception safety guarantees of <code class="computeroutput"><span class="identifier">swap</span><span class="special">(</span><span class="identifier">T</span><span class="special">&,</span><span class="identifier">T</span><span class="special">&)</span></code>.
|
this operation has the exception safety guarantees of <code class="computeroutput"><span class="identifier">swap</span><span class="special">(</span><span class="identifier">T</span><span class="special">&,</span><span class="identifier">T</span><span class="special">&)</span></code>.
|
||||||
If only one is initialized, it has the same basic guarantee as <code class="computeroutput"><span class="identifier">optional</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">reset</span><span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="special">)</span></code>.
|
If only one is initialized, it has the same basic guarantee as <code class="computeroutput"><span class="identifier">optional</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">T</span><span class="special">&&</span>
|
||||||
|
<span class="special">)</span></code>.
|
||||||
</li>
|
</li>
|
||||||
<li class="listitem">
|
<li class="listitem">
|
||||||
<span class="bold"><strong>Example:</strong></span>
|
<span class="bold"><strong>Example:</strong></span>
|
||||||
|
@ -68,6 +68,22 @@
|
|||||||
than the reference itself.
|
than the reference itself.
|
||||||
</li>
|
</li>
|
||||||
</ul></div>
|
</ul></div>
|
||||||
|
<h4>
|
||||||
|
<a name="boost_optional.optional_references.h0"></a>
|
||||||
|
<span class="phrase"><a name="boost_optional.optional_references.rvalue_references"></a></span><a class="link" href="optional_references.html#boost_optional.optional_references.rvalue_references">Rvalue
|
||||||
|
references</a>
|
||||||
|
</h4>
|
||||||
|
<p>
|
||||||
|
Rvalue references and lvalue references to const have the ability in C++ to
|
||||||
|
extend the life time of a temporary they bind to. Optional references do not
|
||||||
|
have this capability, therefore to avoid surprising effects it is not possible
|
||||||
|
to initialize an optional references from a temporary. Optional rvalue references
|
||||||
|
are disabled altogether. Also, the initialization and assignment of an optional
|
||||||
|
reference to const from rvalue reference is disabled.
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting"><span class="keyword">const</span> <span class="keyword">int</span><span class="special">&</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">1</span><span class="special">;</span> <span class="comment">// legal</span>
|
||||||
|
<span class="identifier">optional</span><span class="special"><</span><span class="keyword">const</span> <span class="keyword">int</span><span class="special">&></span> <span class="identifier">oi</span> <span class="special">=</span> <span class="number">1</span><span class="special">;</span> <span class="comment">// illegal</span>
|
||||||
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
<td align="left"></td>
|
<td align="left"></td>
|
||||||
|
@ -37,19 +37,25 @@
|
|||||||
|
|
||||||
<span class="comment">// (If T is of reference type, the parameters and results by reference are by value)</span>
|
<span class="comment">// (If T is of reference type, the parameters and results by reference are by value)</span>
|
||||||
|
|
||||||
<span class="identifier">optional</span> <span class="special">()</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_constructor"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
|
<span class="identifier">optional</span> <span class="special">()</span> <span class="keyword">noexcept</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_constructor"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
|
||||||
|
|
||||||
<span class="identifier">optional</span> <span class="special">(</span> <span class="identifier">none_t</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_constructor_none_t"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
|
<span class="identifier">optional</span> <span class="special">(</span> <span class="identifier">none_t</span> <span class="special">)</span> <span class="keyword">noexcept</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_constructor_none_t"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
|
||||||
|
|
||||||
<span class="identifier">optional</span> <span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_constructor_value"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
|
<span class="identifier">optional</span> <span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_constructor_value"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
|
||||||
|
|
||||||
|
<span class="identifier">optional</span> <span class="special">(</span> <span class="identifier">T</span><span class="special">&&</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_constructor_move_value"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
|
||||||
|
|
||||||
<span class="comment">// [new in 1.34]</span>
|
<span class="comment">// [new in 1.34]</span>
|
||||||
<span class="identifier">optional</span> <span class="special">(</span> <span class="keyword">bool</span> <span class="identifier">condition</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_constructor_bool_value"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
|
<span class="identifier">optional</span> <span class="special">(</span> <span class="keyword">bool</span> <span class="identifier">condition</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_constructor_bool_value"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
|
||||||
|
|
||||||
<span class="identifier">optional</span> <span class="special">(</span> <span class="identifier">optional</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_constructor_optional"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
|
<span class="identifier">optional</span> <span class="special">(</span> <span class="identifier">optional</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_constructor_optional"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
|
||||||
|
|
||||||
|
<span class="identifier">optional</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&&</span> <span class="identifier">rhs</span> <span class="special">)</span> <span class="keyword">noexcept</span><span class="special">(</span><span class="emphasis"><em>see below</em></span><span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_move_constructor_optional"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
|
||||||
|
|
||||||
<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">></span> <span class="keyword">explicit</span> <span class="identifier">optional</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special"><</span><span class="identifier">U</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_constructor_other_optional"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
|
<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">></span> <span class="keyword">explicit</span> <span class="identifier">optional</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special"><</span><span class="identifier">U</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_constructor_other_optional"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
|
||||||
|
|
||||||
|
<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">></span> <span class="keyword">explicit</span> <span class="identifier">optional</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special"><</span><span class="identifier">U</span><span class="special">>&&</span> <span class="identifier">rhs</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_move_constructor_other_optional"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
|
||||||
|
|
||||||
<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">InPlaceFactory</span><span class="special">></span> <span class="keyword">explicit</span> <span class="identifier">optional</span> <span class="special">(</span> <span class="identifier">InPlaceFactory</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">f</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_constructor_factory"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
|
<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">InPlaceFactory</span><span class="special">></span> <span class="keyword">explicit</span> <span class="identifier">optional</span> <span class="special">(</span> <span class="identifier">InPlaceFactory</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">f</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_constructor_factory"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
|
||||||
|
|
||||||
<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">TypedInPlaceFactory</span><span class="special">></span> <span class="keyword">explicit</span> <span class="identifier">optional</span> <span class="special">(</span> <span class="identifier">TypedInPlaceFactory</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">f</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_constructor_factory"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
|
<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">TypedInPlaceFactory</span><span class="special">></span> <span class="keyword">explicit</span> <span class="identifier">optional</span> <span class="special">(</span> <span class="identifier">TypedInPlaceFactory</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">f</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_constructor_factory"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
|
||||||
@ -58,10 +64,16 @@
|
|||||||
|
|
||||||
<span class="identifier">optional</span><span class="special">&</span> <span class="keyword">operator</span> <span class="special">=</span> <span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_operator_equal_value"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
|
<span class="identifier">optional</span><span class="special">&</span> <span class="keyword">operator</span> <span class="special">=</span> <span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_operator_equal_value"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
|
||||||
|
|
||||||
|
<span class="identifier">optional</span><span class="special">&</span> <span class="keyword">operator</span> <span class="special">=</span> <span class="special">(</span> <span class="identifier">T</span><span class="special">&&</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_operator_move_equal_value"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
|
||||||
|
|
||||||
<span class="identifier">optional</span><span class="special">&</span> <span class="keyword">operator</span> <span class="special">=</span> <span class="special">(</span> <span class="identifier">optional</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_operator_equal_optional"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
|
<span class="identifier">optional</span><span class="special">&</span> <span class="keyword">operator</span> <span class="special">=</span> <span class="special">(</span> <span class="identifier">optional</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_operator_equal_optional"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
|
||||||
|
|
||||||
|
<span class="identifier">optional</span><span class="special">&</span> <span class="keyword">operator</span> <span class="special">=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&&</span> <span class="identifier">rhs</span> <span class="special">)</span> <span class="keyword">noexcept</span><span class="special">(</span><span class="emphasis"><em>see below</em></span><span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_operator_move_equal_optional"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
|
||||||
|
|
||||||
<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">></span> <span class="identifier">optional</span><span class="special">&</span> <span class="keyword">operator</span> <span class="special">=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special"><</span><span class="identifier">U</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_operator_equal_other_optional"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
|
<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">></span> <span class="identifier">optional</span><span class="special">&</span> <span class="keyword">operator</span> <span class="special">=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special"><</span><span class="identifier">U</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_operator_equal_other_optional"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
|
||||||
|
|
||||||
|
<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">></span> <span class="identifier">optional</span><span class="special">&</span> <span class="keyword">operator</span> <span class="special">=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special"><</span><span class="identifier">U</span><span class="special">>&&</span> <span class="identifier">rhs</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_operator_move_equal_other_optional"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
|
||||||
|
|
||||||
<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">InPlaceFactory</span><span class="special">></span> <span class="identifier">optional</span><span class="special">&</span> <span class="keyword">operator</span> <span class="special">=</span> <span class="special">(</span> <span class="identifier">InPlaceFactory</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">f</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_operator_equal_factory"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
|
<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">InPlaceFactory</span><span class="special">></span> <span class="identifier">optional</span><span class="special">&</span> <span class="keyword">operator</span> <span class="special">=</span> <span class="special">(</span> <span class="identifier">InPlaceFactory</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">f</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_operator_equal_factory"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
|
||||||
|
|
||||||
<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">TypedInPlaceFactory</span><span class="special">></span> <span class="identifier">optional</span><span class="special">&</span> <span class="keyword">operator</span> <span class="special">=</span> <span class="special">(</span> <span class="identifier">TypedInPlaceFactory</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">f</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_operator_equal_factory"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
|
<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">TypedInPlaceFactory</span><span class="special">></span> <span class="identifier">optional</span><span class="special">&</span> <span class="keyword">operator</span> <span class="special">=</span> <span class="special">(</span> <span class="identifier">TypedInPlaceFactory</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">f</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_operator_equal_factory"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
|
||||||
@ -83,7 +95,7 @@
|
|||||||
|
|
||||||
<span class="keyword">operator</span> <span class="identifier">unspecified</span><span class="special">-</span><span class="keyword">bool</span><span class="special">-</span><span class="identifier">type</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_operator_bool"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
|
<span class="keyword">operator</span> <span class="identifier">unspecified</span><span class="special">-</span><span class="keyword">bool</span><span class="special">-</span><span class="identifier">type</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_operator_bool"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
|
||||||
|
|
||||||
<span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!()</span> <span class="keyword">const</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_operator_not"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
|
<span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_operator_not"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
|
||||||
|
|
||||||
<span class="comment">// deprecated methods</span>
|
<span class="comment">// deprecated methods</span>
|
||||||
|
|
||||||
|
@ -163,7 +163,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
<td align="left"><p><small>Last revised: April 11, 2014 at 13:25:26 GMT</small></p></td>
|
<td align="left"><p><small>Last revised: April 28, 2014 at 23:02:29 GMT</small></p></td>
|
||||||
<td align="right"><div class="copyright-footer"></div></td>
|
<td align="right"><div class="copyright-footer"></div></td>
|
||||||
</tr></table>
|
</tr></table>
|
||||||
<hr>
|
<hr>
|
||||||
|
@ -22,18 +22,24 @@
|
|||||||
|
|
||||||
// (If T is of reference type, the parameters and results by reference are by value)
|
// (If T is of reference type, the parameters and results by reference are by value)
|
||||||
|
|
||||||
optional () ; ``[link reference_optional_constructor __GO_TO__]``
|
optional () noexcept ; ``[link reference_optional_constructor __GO_TO__]``
|
||||||
|
|
||||||
optional ( none_t ) ; ``[link reference_optional_constructor_none_t __GO_TO__]``
|
optional ( none_t ) noexcept ; ``[link reference_optional_constructor_none_t __GO_TO__]``
|
||||||
|
|
||||||
optional ( T const& v ) ; ``[link reference_optional_constructor_value __GO_TO__]``
|
optional ( T const& v ) ; ``[link reference_optional_constructor_value __GO_TO__]``
|
||||||
|
|
||||||
|
optional ( T&& v ) ; ``[link reference_optional_constructor_move_value __GO_TO__]``
|
||||||
|
|
||||||
// [new in 1.34]
|
// [new in 1.34]
|
||||||
optional ( bool condition, T const& v ) ; ``[link reference_optional_constructor_bool_value __GO_TO__]``
|
optional ( bool condition, T const& v ) ; ``[link reference_optional_constructor_bool_value __GO_TO__]``
|
||||||
|
|
||||||
optional ( optional const& rhs ) ; ``[link reference_optional_constructor_optional __GO_TO__]``
|
optional ( optional const& rhs ) ; ``[link reference_optional_constructor_optional __GO_TO__]``
|
||||||
|
|
||||||
|
optional ( optional&& rhs ) noexcept(``['see below]``) ; ``[link reference_optional_move_constructor_optional __GO_TO__]``
|
||||||
|
|
||||||
template<class U> explicit optional ( optional<U> const& rhs ) ; ``[link reference_optional_constructor_other_optional __GO_TO__]``
|
template<class U> explicit optional ( optional<U> const& rhs ) ; ``[link reference_optional_constructor_other_optional __GO_TO__]``
|
||||||
|
|
||||||
|
template<class U> explicit optional ( optional<U>&& rhs ) ; ``[link reference_optional_move_constructor_other_optional __GO_TO__]``
|
||||||
|
|
||||||
template<class InPlaceFactory> explicit optional ( InPlaceFactory const& f ) ; ``[link reference_optional_constructor_factory __GO_TO__]``
|
template<class InPlaceFactory> explicit optional ( InPlaceFactory const& f ) ; ``[link reference_optional_constructor_factory __GO_TO__]``
|
||||||
|
|
||||||
@ -42,10 +48,16 @@
|
|||||||
optional& operator = ( none_t ) ; ``[/[link reference_optional_operator_equal_none_t __GO_TO__]]``
|
optional& operator = ( none_t ) ; ``[/[link reference_optional_operator_equal_none_t __GO_TO__]]``
|
||||||
|
|
||||||
optional& operator = ( T const& v ) ; ``[link reference_optional_operator_equal_value __GO_TO__]``
|
optional& operator = ( T const& v ) ; ``[link reference_optional_operator_equal_value __GO_TO__]``
|
||||||
|
|
||||||
|
optional& operator = ( T&& v ) ; ``[link reference_optional_operator_move_equal_value __GO_TO__]``
|
||||||
|
|
||||||
optional& operator = ( optional const& rhs ) ; ``[link reference_optional_operator_equal_optional __GO_TO__]``
|
optional& operator = ( optional const& rhs ) ; ``[link reference_optional_operator_equal_optional __GO_TO__]``
|
||||||
|
|
||||||
|
optional& operator = ( optional&& rhs ) noexcept(``['see below]``) ; ``[link reference_optional_operator_move_equal_optional __GO_TO__]``
|
||||||
|
|
||||||
template<class U> optional& operator = ( optional<U> const& rhs ) ; ``[link reference_optional_operator_equal_other_optional __GO_TO__]``
|
template<class U> optional& operator = ( optional<U> const& rhs ) ; ``[link reference_optional_operator_equal_other_optional __GO_TO__]``
|
||||||
|
|
||||||
|
template<class U> optional& operator = ( optional<U>&& rhs ) ; ``[link reference_optional_operator_move_equal_other_optional __GO_TO__]``
|
||||||
|
|
||||||
template<class InPlaceFactory> optional& operator = ( InPlaceFactory const& f ) ; ``[link reference_optional_operator_equal_factory __GO_TO__]``
|
template<class InPlaceFactory> optional& operator = ( InPlaceFactory const& f ) ; ``[link reference_optional_operator_equal_factory __GO_TO__]``
|
||||||
|
|
||||||
@ -68,7 +80,7 @@
|
|||||||
|
|
||||||
operator unspecified-bool-type() const ; ``[link reference_optional_operator_bool __GO_TO__]``
|
operator unspecified-bool-type() const ; ``[link reference_optional_operator_bool __GO_TO__]``
|
||||||
|
|
||||||
bool operator!() const ; ``[link reference_optional_operator_not __GO_TO__]``
|
bool operator!() const noexcept ; ``[link reference_optional_operator_not __GO_TO__]``
|
||||||
|
|
||||||
// deprecated methods
|
// deprecated methods
|
||||||
|
|
||||||
@ -151,12 +163,11 @@ __SPACE__
|
|||||||
|
|
||||||
[#reference_optional_constructor]
|
[#reference_optional_constructor]
|
||||||
|
|
||||||
[: `optional<T>::optional();`]
|
[: `optional<T>::optional() noexcept;`]
|
||||||
|
|
||||||
* [*Effect:] Default-Constructs an `optional`.
|
* [*Effect:] Default-Constructs an `optional`.
|
||||||
* [*Postconditions:] `*this` is [_uninitialized].
|
* [*Postconditions:] `*this` is [_uninitialized].
|
||||||
* [*Throws:] Nothing.
|
* [*Notes:] T's default constructor [_is not] called.
|
||||||
* Notes: T's default constructor [_is not] called.
|
|
||||||
* [*Example:]
|
* [*Example:]
|
||||||
``
|
``
|
||||||
optional<T> def ;
|
optional<T> def ;
|
||||||
@ -167,11 +178,10 @@ __SPACE__
|
|||||||
|
|
||||||
[#reference_optional_constructor_none_t]
|
[#reference_optional_constructor_none_t]
|
||||||
|
|
||||||
[: `optional<T>::optional( none_t );`]
|
[: `optional<T>::optional( none_t ) noexcept;`]
|
||||||
|
|
||||||
* [*Effect:] Constructs an `optional` uninitialized.
|
* [*Effect:] Constructs an `optional` uninitialized.
|
||||||
* [*Postconditions:] `*this` is [_uninitialized].
|
* [*Postconditions:] `*this` is [_uninitialized].
|
||||||
* [*Throws:] Nothing.
|
|
||||||
* [*Notes:] `T`'s default constructor [_is not] called. The expression
|
* [*Notes:] `T`'s default constructor [_is not] called. The expression
|
||||||
`boost::none` denotes an instance of `boost::none_t` that can be used as
|
`boost::none` denotes an instance of `boost::none_t` that can be used as
|
||||||
the parameter.
|
the parameter.
|
||||||
@ -188,8 +198,9 @@ __SPACE__
|
|||||||
|
|
||||||
[: `optional<T `['(not a ref)]`>::optional( T const& v )`]
|
[: `optional<T `['(not a ref)]`>::optional( T const& v )`]
|
||||||
|
|
||||||
|
* [*Requires:] `is_copy_constructible<T>::value` is `true`.
|
||||||
* [*Effect:] Directly-Constructs an `optional`.
|
* [*Effect:] Directly-Constructs an `optional`.
|
||||||
* [*Postconditions:] `*this` is [_initialized] and its value is a['copy]
|
* [*Postconditions:] `*this` is [_initialized] and its value is a ['copy]
|
||||||
of `v`.
|
of `v`.
|
||||||
* [*Throws:] Whatever `T::T( T const& )` throws.
|
* [*Throws:] Whatever `T::T( T const& )` throws.
|
||||||
* [*Notes: ] `T::T( T const& )` is called.
|
* [*Notes: ] `T::T( T const& )` is called.
|
||||||
@ -220,6 +231,33 @@ assert ( *opt == v ) ;
|
|||||||
assert (*opt == v);
|
assert (*opt == v);
|
||||||
``
|
``
|
||||||
|
|
||||||
|
__SPACE__
|
||||||
|
|
||||||
|
[#reference_optional_constructor_move_value]
|
||||||
|
|
||||||
|
[: `optional<T `['(not a ref)]`>::optional( T&& v )`]
|
||||||
|
|
||||||
|
* [*Requires:] `is_move_constructible<T>::value` is `true`.
|
||||||
|
* [*Effect:] Directly-Move-Constructs an `optional`.
|
||||||
|
* [*Postconditions:] `*this` is [_initialized] and its value is move-constructed from `v`.
|
||||||
|
* [*Throws:] Whatever `T::T( T&& )` throws.
|
||||||
|
* [*Notes: ] `T::T( T&& )` is called.
|
||||||
|
* [*Exception Safety:] Exceptions can only be thrown during
|
||||||
|
`T::T( T&& );` in that case, the state of `v` is determined by exception safety guarantees for `T::T(T&&)`.
|
||||||
|
* [*Example:]
|
||||||
|
``
|
||||||
|
T v1, v2;
|
||||||
|
optional<T> opt(std::move(v1));
|
||||||
|
assert ( *opt == v2 ) ;
|
||||||
|
``
|
||||||
|
|
||||||
|
__SPACE__
|
||||||
|
|
||||||
|
[: `optional<T&>::optional( T&& ref ) = delete`]
|
||||||
|
|
||||||
|
* [*Notes:] This constructor is deleted
|
||||||
|
|
||||||
|
|
||||||
__SPACE__
|
__SPACE__
|
||||||
|
|
||||||
[#reference_optional_constructor_bool_value]
|
[#reference_optional_constructor_bool_value]
|
||||||
@ -243,6 +281,7 @@ __SPACE__
|
|||||||
|
|
||||||
[: `optional<T `['(not a ref)]`>::optional( optional const& rhs );`]
|
[: `optional<T `['(not a ref)]`>::optional( optional const& rhs );`]
|
||||||
|
|
||||||
|
* [*Requires:] `is_copy_constructible<T>::value` is `true`.
|
||||||
* [*Effect:] Copy-Constructs an `optional`.
|
* [*Effect:] Copy-Constructs an `optional`.
|
||||||
* [*Postconditions:] If rhs is initialized, `*this` is initialized and
|
* [*Postconditions:] If rhs is initialized, `*this` is initialized and
|
||||||
its value is a ['copy] of the value of `rhs`; else `*this` is uninitialized.
|
its value is a ['copy] of the value of `rhs`; else `*this` is uninitialized.
|
||||||
@ -299,6 +338,70 @@ assert ( *init2 == 3 ) ;
|
|||||||
|
|
||||||
__SPACE__
|
__SPACE__
|
||||||
|
|
||||||
|
[#reference_optional_move_constructor_optional]
|
||||||
|
|
||||||
|
[: `optional<T `['(not a ref)]`>::optional( optional&& rhs ) noexcept(`['see below]`);`]
|
||||||
|
|
||||||
|
* [*Requires:] `is_move_constructible<T>::value` is `true`.
|
||||||
|
* [*Effect:] Move-constructs an `optional`.
|
||||||
|
* [*Postconditions:] If `rhs` is initialized, `*this` is initialized and
|
||||||
|
its value is move constructed from `rhs`; else `*this` is uninitialized.
|
||||||
|
* [*Throws:] Whatever `T::T( T&& )` throws.
|
||||||
|
* [*Notes:] If `rhs` is initialized, `T::T( T && )` is called. The expression inside `noexcept` is equivalent to `is_nothrow_move_constructible<T>::value`.
|
||||||
|
* [*Exception Safety:] Exceptions can only be thrown during
|
||||||
|
`T::T( T&& );` in that case, `rhs` remains initialized and the value of `*rhs` is determined by exception safety of `T::T(T&&)`.
|
||||||
|
* [*Example:]
|
||||||
|
``
|
||||||
|
optional<std::unique_ptr<T>> uninit ;
|
||||||
|
assert (!uninit);
|
||||||
|
|
||||||
|
optional<std::unique_ptr<T>> uinit2 ( std::move(uninit) ) ;
|
||||||
|
assert ( uninit2 == uninit );
|
||||||
|
|
||||||
|
optional<std::unique_ptr<T>> init( std::uniqye_ptr<T>(new T(2)) );
|
||||||
|
assert ( **init == T(2) ) ;
|
||||||
|
|
||||||
|
optional<std::unique_ptr<T>> init2 ( std::move(init) ) ;
|
||||||
|
assert ( init );
|
||||||
|
assert ( *init == nullptr );
|
||||||
|
assert ( init2 );
|
||||||
|
assert ( **init2 == T(2) ) ;
|
||||||
|
``
|
||||||
|
|
||||||
|
__SPACE__
|
||||||
|
|
||||||
|
[: `optional<T&>::optional( optional && rhs );`]
|
||||||
|
|
||||||
|
* [*Effect:] Move-Constructs an `optional`.
|
||||||
|
* [*Postconditions:] If `rhs` is initialized, `*this` is initialized and its
|
||||||
|
value is another reference to the same object referenced by `*rhs`; else
|
||||||
|
`*this` is uninitialized.
|
||||||
|
* [*Throws:] Nothing.
|
||||||
|
* [*Notes:] If `rhs` is initialized, both `*this` and `*rhs` will reefer to the
|
||||||
|
same object (they alias).
|
||||||
|
* [*Example:]
|
||||||
|
``
|
||||||
|
optional<std::unique_ptr<T>&> uninit ;
|
||||||
|
assert (!uninit);
|
||||||
|
|
||||||
|
optional<std::unique_ptr<T>&> uinit2 ( std::move(uninit) ) ;
|
||||||
|
assert ( uninit2 == uninit );
|
||||||
|
|
||||||
|
std::unique_ptr<T> v(new T(2)) ;
|
||||||
|
optional<std::unique_ptr<T>&> init(v);
|
||||||
|
assert ( *init == v ) ;
|
||||||
|
|
||||||
|
optional<std::unique_ptr<T>&> init2 ( std::move(init) ) ;
|
||||||
|
assert ( *init2 == v ) ;
|
||||||
|
|
||||||
|
*v = 3 ;
|
||||||
|
|
||||||
|
assert ( **init == 3 ) ;
|
||||||
|
assert ( **init2 == 3 ) ;
|
||||||
|
``
|
||||||
|
|
||||||
|
__SPACE__
|
||||||
|
|
||||||
[#reference_optional_constructor_other_optional]
|
[#reference_optional_constructor_other_optional]
|
||||||
|
|
||||||
[: `template<U> explicit optional<T` ['(not a ref)]`>::optional( optional<U> const& rhs );`]
|
[: `template<U> explicit optional<T` ['(not a ref)]`>::optional( optional<U> const& rhs );`]
|
||||||
@ -323,6 +426,30 @@ assert( *y == 123 ) ;
|
|||||||
|
|
||||||
__SPACE__
|
__SPACE__
|
||||||
|
|
||||||
|
[#reference_optional_move_constructor_other_optional]
|
||||||
|
|
||||||
|
[: `template<U> explicit optional<T` ['(not a ref)]`>::optional( optional<U>&& rhs );`]
|
||||||
|
|
||||||
|
* [*Effect:] Move-constructs an `optional`.
|
||||||
|
* [*Postconditions:] If `rhs` is initialized, `*this` is initialized and its
|
||||||
|
value is move constructed from `*rhs`; else `*this` is
|
||||||
|
uninitialized.
|
||||||
|
* [*Throws:] Whatever `T::T( U&& )` throws.
|
||||||
|
* [*Notes: ] `T::T( U&& )` is called if `rhs` is initialized, which requires a
|
||||||
|
valid conversion from `U` to `T`.
|
||||||
|
* [*Exception Safety:] Exceptions can only be thrown during `T::T( U&& );`
|
||||||
|
in that case, `rhs` remains initialized and the value of `*rhs` is determined by exception safety guarantee of `T::T( U&& )`.
|
||||||
|
* [*Example:]
|
||||||
|
``
|
||||||
|
optional<double> x(123.4);
|
||||||
|
assert ( *x == 123.4 ) ;
|
||||||
|
|
||||||
|
optional<int> y(std::move(x)) ;
|
||||||
|
assert( *y == 123 ) ;
|
||||||
|
``
|
||||||
|
|
||||||
|
__SPACE__
|
||||||
|
|
||||||
[#reference_optional_constructor_factory]
|
[#reference_optional_constructor_factory]
|
||||||
|
|
||||||
[: `template<InPlaceFactory> explicit optional<T` ['(not a ref)]`>::optional( InPlaceFactory const& f );`]
|
[: `template<InPlaceFactory> explicit optional<T` ['(not a ref)]`>::optional( InPlaceFactory const& f );`]
|
||||||
@ -408,6 +535,42 @@ c = 4 ;
|
|||||||
assert ( *opt == 4 ) ;
|
assert ( *opt == 4 ) ;
|
||||||
``
|
``
|
||||||
|
|
||||||
|
__SPACE__
|
||||||
|
|
||||||
|
[#reference_optional_operator_move_equal_value]
|
||||||
|
|
||||||
|
[: `optional& optional<T` ['(not a ref)]`>::operator= ( T&& rhs ) ;`]
|
||||||
|
|
||||||
|
* [*Effect:] Moves the value `rhs` to an `optional`.
|
||||||
|
* [*Postconditions: ] `*this` is initialized and its value is moved from `rhs`.
|
||||||
|
* [*Throws:] Whatever `T::operator=( T&& )` or `T::T(T &&)` throws.
|
||||||
|
* [*Notes:] If `*this` was initialized, `T`'s move-assignment operator is used,
|
||||||
|
otherwise, its move-constructor is used.
|
||||||
|
* [*Exception Safety:] In the event of an exception, the initialization
|
||||||
|
state of `*this` is unchanged and its value unspecified as far as `optional`
|
||||||
|
is concerned (it is up to `T`'s `operator=()`). If `*this` is initially
|
||||||
|
uninitialized and `T`'s ['move constructor] fails, `*this` is left properly
|
||||||
|
uninitialized.
|
||||||
|
* [*Example:]
|
||||||
|
``
|
||||||
|
T x;
|
||||||
|
optional<T> def ;
|
||||||
|
optional<T> opt(x) ;
|
||||||
|
|
||||||
|
T y1, y2, yR;
|
||||||
|
def = std::move(y1) ;
|
||||||
|
assert ( *def == yR ) ;
|
||||||
|
opt = std::move(y2) ;
|
||||||
|
assert ( *opt == yR ) ;
|
||||||
|
``
|
||||||
|
|
||||||
|
__SPACE__
|
||||||
|
|
||||||
|
[: `optional<T&>& optional<T&>::operator= ( T&& rhs ) = delete;`]
|
||||||
|
|
||||||
|
* [*Notes:] This assignment operator is deleted.
|
||||||
|
|
||||||
|
|
||||||
__SPACE__
|
__SPACE__
|
||||||
|
|
||||||
[#reference_optional_operator_equal_optional]
|
[#reference_optional_operator_equal_optional]
|
||||||
@ -471,6 +634,42 @@ assert ( *ora == 4 ) ;
|
|||||||
|
|
||||||
__SPACE__
|
__SPACE__
|
||||||
|
|
||||||
|
[#reference_optional_operator_move_equal_optional]
|
||||||
|
|
||||||
|
[: `optional& optional<T` ['(not a ref)]`>::operator= ( optional&& rhs ) noexcept(`['see below]`);`]
|
||||||
|
|
||||||
|
* [*Effect:] Move-assigns another `optional` to an `optional`.
|
||||||
|
* [*Postconditions:] If `rhs` is initialized, `*this` is initialized and
|
||||||
|
its value is moved from `*rhs`, `rhs` remains initialized; else `*this` is uninitialized.
|
||||||
|
* [*Throws:] Whatever `T::operator( T&& )` or `T::T( T && )` throws.
|
||||||
|
* [*Notes:] If both `*this` and `rhs` are initially initialized, `T`'s
|
||||||
|
['move assignment operator] is used. If `*this` is initially initialized but `rhs` is
|
||||||
|
uninitialized, `T`'s [destructor] is called. If `*this` is initially uninitialized
|
||||||
|
but `rhs` is initialized, `T`'s ['move constructor] is called. The expression inside `noexcept` is equivalent to `is_nothrow_move_constructible<T>::value && is_nothrow_move_assignable<T>::value`.
|
||||||
|
* [*Exception Safety:] In the event of an exception, the initialization state of
|
||||||
|
`*this` is unchanged and its value unspecified as far as optional is concerned
|
||||||
|
(it is up to `T`'s `operator=()`). If `*this` is initially uninitialized and
|
||||||
|
`T`'s ['move constructor] fails, `*this` is left properly uninitialized.
|
||||||
|
* [*Example:]
|
||||||
|
``
|
||||||
|
optional<T> opt(T(2)) ;
|
||||||
|
optional<T> def ;
|
||||||
|
|
||||||
|
opt = def ;
|
||||||
|
assert ( def ) ;
|
||||||
|
assert ( opt ) ;
|
||||||
|
assert ( *opt == T(2) ) ;
|
||||||
|
``
|
||||||
|
|
||||||
|
__SPACE__
|
||||||
|
|
||||||
|
[: `optional<T&> & optional<T&>::operator= ( optional<T&>&& rhs ) ;`]
|
||||||
|
|
||||||
|
* [*Effect:] Same as `optional<T&>::operator= ( optional<T&> const& rhs )`.
|
||||||
|
|
||||||
|
__SPACE__
|
||||||
|
|
||||||
|
|
||||||
[#reference_optional_operator_equal_other_optional]
|
[#reference_optional_operator_equal_other_optional]
|
||||||
|
|
||||||
[: `template<U> optional& optional<T` ['(not a ref)]`>::operator= ( optional<U> const& rhs ) ;`]
|
[: `template<U> optional& optional<T` ['(not a ref)]`>::operator= ( optional<U> const& rhs ) ;`]
|
||||||
@ -502,6 +701,37 @@ assert ( *opt1 == static_cast<U>(v) ) ;
|
|||||||
|
|
||||||
__SPACE__
|
__SPACE__
|
||||||
|
|
||||||
|
[#reference_optional_operator_move_equal_other_optional]
|
||||||
|
|
||||||
|
[: `template<U> optional& optional<T` ['(not a ref)]`>::operator= ( optional<U>&& rhs ) ;`]
|
||||||
|
|
||||||
|
* [*Effect:] Move-assigns another convertible optional to an optional.
|
||||||
|
* [*Postconditions:] If `rhs` is initialized, `*this` is initialized and
|
||||||
|
its value is moved from the value of `rhs`; else
|
||||||
|
`*this` is uninitialized.
|
||||||
|
* [*Throws:] Whatever `T::operator=( U&& )` or `T::T( U&& )` throws.
|
||||||
|
* [*Notes:] If both `*this` and `rhs` are initially initialized, `T`'s
|
||||||
|
[' assignment operator] (from `U&&`) is used. If `*this` is initially initialized
|
||||||
|
but `rhs` is uninitialized, `T`'s ['destructor] is called. If `*this` is
|
||||||
|
initially uninitialized but `rhs` is initialized, `T`'s ['converting constructor]
|
||||||
|
(from `U&&`) is called.
|
||||||
|
* [*Exception Safety:] In the event of an exception, the initialization state
|
||||||
|
of `*this` is unchanged and its value unspecified as far as optional is
|
||||||
|
concerned (it is up to `T`'s `operator=()`). If `*this` is initially
|
||||||
|
uninitialized and `T`'s converting constructor fails, `*this` is left properly
|
||||||
|
uninitialized.
|
||||||
|
* [*Example:]
|
||||||
|
``
|
||||||
|
T v;
|
||||||
|
optional<T> opt0(v);
|
||||||
|
optional<U> opt1;
|
||||||
|
|
||||||
|
opt1 = std::move(opt0) ;
|
||||||
|
assert ( *opt1 == static_cast<U>(v) ) ;
|
||||||
|
``
|
||||||
|
|
||||||
|
__SPACE__
|
||||||
|
|
||||||
[#reference_optional_operator_equal_factory]
|
[#reference_optional_operator_equal_factory]
|
||||||
|
|
||||||
[: `template<InPlaceFactory> optional<T>& optional<T` ['(not a ref)]`>::operator=( InPlaceFactory const& f );`]
|
[: `template<InPlaceFactory> optional<T>& optional<T` ['(not a ref)]`>::operator=( InPlaceFactory const& f );`]
|
||||||
@ -543,7 +773,7 @@ __SPACE__
|
|||||||
[: `inline T const& get ( optional<T` ['(not a ref)]`> const& ) ;`]
|
[: `inline T const& get ( optional<T` ['(not a ref)]`> const& ) ;`]
|
||||||
[: `inline T& get ( optional<T` ['(not a ref)]`> &) ;`]
|
[: `inline T& get ( optional<T` ['(not a ref)]`> &) ;`]
|
||||||
|
|
||||||
* [*Requirements:] `*this` is initialized
|
* [*Requires:] `*this` is initialized
|
||||||
* [*Returns:] A reference to the contained value
|
* [*Returns:] A reference to the contained value
|
||||||
* [*Throws:] Nothing.
|
* [*Throws:] Nothing.
|
||||||
* [*Notes:] The requirement is asserted via `BOOST_ASSERT()`.
|
* [*Notes:] The requirement is asserted via `BOOST_ASSERT()`.
|
||||||
@ -593,7 +823,7 @@ __SPACE__
|
|||||||
[: `inline T const& get ( optional<T&> const& ) ;`]
|
[: `inline T const& get ( optional<T&> const& ) ;`]
|
||||||
[: `inline T& get ( optional<T&> &) ;`]
|
[: `inline T& get ( optional<T&> &) ;`]
|
||||||
|
|
||||||
* [*Requirements: ] `*this` is initialized
|
* [*Requires: ] `*this` is initialized
|
||||||
* [*Returns:] [_The] reference contained.
|
* [*Returns:] [_The] reference contained.
|
||||||
* [*Throws:] Nothing.
|
* [*Throws:] Nothing.
|
||||||
* [*Notes:] The requirement is asserted via `BOOST_ASSERT()`.
|
* [*Notes:] The requirement is asserted via `BOOST_ASSERT()`.
|
||||||
@ -641,7 +871,7 @@ __SPACE__
|
|||||||
[: `T const* optional<T` ['(not a ref)]`>::operator ->() const ;`]
|
[: `T const* optional<T` ['(not a ref)]`>::operator ->() const ;`]
|
||||||
[: `T* optional<T` ['(not a ref)]`>::operator ->() ;`]
|
[: `T* optional<T` ['(not a ref)]`>::operator ->() ;`]
|
||||||
|
|
||||||
* [*Requirements: ] `*this` is initialized.
|
* [*Requires: ] `*this` is initialized.
|
||||||
* [*Returns:] A pointer to the contained value.
|
* [*Returns:] A pointer to the contained value.
|
||||||
* [*Throws:] Nothing.
|
* [*Throws:] Nothing.
|
||||||
* [*Notes:] The requirement is asserted via `BOOST_ASSERT()`.
|
* [*Notes:] The requirement is asserted via `BOOST_ASSERT()`.
|
||||||
@ -675,10 +905,9 @@ __SPACE__
|
|||||||
|
|
||||||
[#reference_optional_operator_not]
|
[#reference_optional_operator_not]
|
||||||
|
|
||||||
[: `bool optional<T>::operator!() ;`]
|
[: `bool optional<T>::operator!() noexcept ;`]
|
||||||
|
|
||||||
* [*Returns:] If `*this` is uninitialized, `true`; else `false`.
|
* [*Returns:] If `*this` is uninitialized, `true`; else `false`.
|
||||||
* [*Throws:] Nothing.
|
|
||||||
* [*Notes:] This operator is provided for those compilers which can't
|
* [*Notes:] This operator is provided for those compilers which can't
|
||||||
use the ['unspecified-bool-type operator] in certain boolean contexts.
|
use the ['unspecified-bool-type operator] in certain boolean contexts.
|
||||||
* [*Example:]
|
* [*Example:]
|
||||||
@ -852,21 +1081,21 @@ __SPACE__
|
|||||||
|
|
||||||
[#reference_swap_optional_optional]
|
[#reference_swap_optional_optional]
|
||||||
|
|
||||||
[: `void swap ( optional<T>& x, optional<T>& y );`]
|
[: `void swap ( optional<T>& x, optional<T>& y ) ;`]
|
||||||
|
|
||||||
* [*Effect:] If both `x` and `y` are initialized, calls `swap(*x,*y)`
|
* [*Effect:] If both `x` and `y` are initialized, calls `swap(*x,*y)`
|
||||||
using `std::swap`. If only one is initialized, say `x`, calls:
|
using `std::swap`. If only one is initialized, say `x`, calls:
|
||||||
`y.reset(*x); x.reset();` If none is initialized, does nothing.
|
`y.reset(*x); x.reset();` If none is initialized, does nothing.
|
||||||
* [*Postconditions:] The states of `x` and `y` interchanged.
|
* [*Postconditions:] The states of `x` and `y` interchanged.
|
||||||
* [*Throws:] If both are initialized, whatever `swap(T&,T&)` throws. If only
|
* [*Throws:] If both are initialized, whatever `swap(T&,T&)` throws. If only
|
||||||
one is initialized, whatever `T::T ( T const& )` throws.
|
one is initialized, whatever `T::T ( T&& )` throws.
|
||||||
* [*Notes:] If both are initialized, `swap(T&,T&)` is used unqualified but
|
* [*Notes:] If both are initialized, `swap(T&,T&)` is used unqualified but
|
||||||
with `std::swap` introduced in scope.
|
with `std::swap` introduced in scope.
|
||||||
If only one is initialized, `T::~T()` and `T::T( T const& )` is called.
|
If only one is initialized, `T::~T()` and `T::T( T&& )` is called.
|
||||||
* [*Exception Safety:] If both are initialized, this operation has the
|
* [*Exception Safety:] If both are initialized, this operation has the
|
||||||
exception safety guarantees of `swap(T&,T&)`.
|
exception safety guarantees of `swap(T&,T&)`.
|
||||||
If only one is initialized, it has the same basic guarantee as
|
If only one is initialized, it has the same basic guarantee as
|
||||||
`optional<T>::reset( T const& )`.
|
`optional<T>::operator= ( T&& )`.
|
||||||
* [*Example:]
|
* [*Example:]
|
||||||
``
|
``
|
||||||
T x(12);
|
T x(12);
|
||||||
|
@ -21,6 +21,13 @@ will nonetheless reefer to the same object.
|
|||||||
* Value-access will actually provide access to the referenced object
|
* Value-access will actually provide access to the referenced object
|
||||||
rather than the reference itself.
|
rather than the reference itself.
|
||||||
|
|
||||||
|
[heading Rvalue references]
|
||||||
|
|
||||||
|
Rvalue references and lvalue references to const have the ability in C++ to extend the life time of a temporary they bind to. Optional references do not have this capability, therefore to avoid surprising effects it is not possible to initialize an optional references from a temporary. Optional rvalue references are disabled altogether. Also, the initialization and assignment of an optional reference to const from rvalue reference is disabled.
|
||||||
|
|
||||||
|
const int& i = 1; // legal
|
||||||
|
optional<const int&> oi = 1; // illegal
|
||||||
|
|
||||||
[endsect]
|
[endsect]
|
||||||
|
|
||||||
[section Rebinding semantics for assignment of optional references]
|
[section Rebinding semantics for assignment of optional references]
|
||||||
|
@ -30,6 +30,8 @@
|
|||||||
#include <boost/type_traits/decay.hpp>
|
#include <boost/type_traits/decay.hpp>
|
||||||
#include <boost/type_traits/is_base_of.hpp>
|
#include <boost/type_traits/is_base_of.hpp>
|
||||||
#include <boost/type_traits/is_lvalue_reference.hpp>
|
#include <boost/type_traits/is_lvalue_reference.hpp>
|
||||||
|
#include <boost/type_traits/is_nothrow_move_assignable.hpp>
|
||||||
|
#include <boost/type_traits/is_nothrow_move_constructible.hpp>
|
||||||
#include <boost/type_traits/is_reference.hpp>
|
#include <boost/type_traits/is_reference.hpp>
|
||||||
#include <boost/type_traits/is_rvalue_reference.hpp>
|
#include <boost/type_traits/is_rvalue_reference.hpp>
|
||||||
#include <boost/type_traits/is_same.hpp>
|
#include <boost/type_traits/is_same.hpp>
|
||||||
@ -99,8 +101,7 @@ class in_place_factory_base ;
|
|||||||
class typed_in_place_factory_base ;
|
class typed_in_place_factory_base ;
|
||||||
|
|
||||||
// This forward is needed to refer to namespace scope swap from the member swap
|
// This forward is needed to refer to namespace scope swap from the member swap
|
||||||
template<class T> void swap ( optional<T>& x, optional<T>& y )
|
template<class T> void swap ( optional<T>& x, optional<T>& y );
|
||||||
BOOST_NOEXCEPT_IF(::boost::is_nothrow_move_constructible<T>::value && ::boost::is_nothrow_move_assignable<T>::value);
|
|
||||||
|
|
||||||
namespace optional_detail {
|
namespace optional_detail {
|
||||||
|
|
||||||
@ -1242,6 +1243,37 @@ struct swap_selector<true>
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
|
||||||
|
template<>
|
||||||
|
struct swap_selector<false>
|
||||||
|
{
|
||||||
|
template<class T>
|
||||||
|
static void optional_swap ( optional<T>& x, optional<T>& y )
|
||||||
|
//BOOST_NOEXCEPT_IF(::boost::is_nothrow_move_constructible<T>::value && BOOST_NOEXCEPT_EXPR(boost::swap(*x, *y)))
|
||||||
|
{
|
||||||
|
if(x)
|
||||||
|
{
|
||||||
|
if (y)
|
||||||
|
{
|
||||||
|
boost::swap(*x, *y);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
y = boost::move(*x);
|
||||||
|
x = boost::none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (y)
|
||||||
|
{
|
||||||
|
x = boost::move(*y);
|
||||||
|
y = boost::none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
#else
|
||||||
template<>
|
template<>
|
||||||
struct swap_selector<false>
|
struct swap_selector<false>
|
||||||
{
|
{
|
||||||
@ -1268,6 +1300,7 @@ struct swap_selector<false>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
#endif // !defined BOOST_NO_CXX11_RVALUE_REFERENCES
|
||||||
|
|
||||||
} // namespace optional_detail
|
} // namespace optional_detail
|
||||||
|
|
||||||
@ -1275,7 +1308,7 @@ template<class T>
|
|||||||
struct optional_swap_should_use_default_constructor : has_nothrow_default_constructor<T> {} ;
|
struct optional_swap_should_use_default_constructor : has_nothrow_default_constructor<T> {} ;
|
||||||
|
|
||||||
template<class T> inline void swap ( optional<T>& x, optional<T>& y )
|
template<class T> inline void swap ( optional<T>& x, optional<T>& y )
|
||||||
BOOST_NOEXCEPT_IF(::boost::is_nothrow_move_constructible<T>::value && ::boost::is_nothrow_move_assignable<T>::value)
|
//BOOST_NOEXCEPT_IF(::boost::is_nothrow_move_constructible<T>::value && BOOST_NOEXCEPT_EXPR(boost::swap(*x, *y)))
|
||||||
{
|
{
|
||||||
optional_detail::swap_selector<optional_swap_should_use_default_constructor<T>::value>::optional_swap(x, y);
|
optional_detail::swap_selector<optional_swap_should_use_default_constructor<T>::value>::optional_swap(x, y);
|
||||||
}
|
}
|
||||||
|
@ -16,16 +16,13 @@
|
|||||||
#ifndef BOOST_OPTIONAL_OPTIONAL_FWD_FLC_19NOV2002_HPP
|
#ifndef BOOST_OPTIONAL_OPTIONAL_FWD_FLC_19NOV2002_HPP
|
||||||
#define BOOST_OPTIONAL_OPTIONAL_FWD_FLC_19NOV2002_HPP
|
#define BOOST_OPTIONAL_OPTIONAL_FWD_FLC_19NOV2002_HPP
|
||||||
#include <boost/config.hpp>
|
#include <boost/config.hpp>
|
||||||
#include <boost/type_traits/is_nothrow_move_assignable.hpp>
|
|
||||||
#include <boost/type_traits/is_nothrow_move_constructible.hpp>
|
|
||||||
|
|
||||||
|
|
||||||
namespace boost {
|
namespace boost {
|
||||||
|
|
||||||
template<class T> class optional ;
|
template<class T> class optional ;
|
||||||
|
|
||||||
template<class T> void swap ( optional<T>& , optional<T>& )
|
template<class T> void swap ( optional<T>& , optional<T>& );
|
||||||
BOOST_NOEXCEPT_IF(::boost::is_nothrow_move_constructible<T>::value && ::boost::is_nothrow_move_assignable<T>::value);
|
|
||||||
|
|
||||||
template<class T> struct optional_swap_should_use_default_constructor ;
|
template<class T> struct optional_swap_should_use_default_constructor ;
|
||||||
|
|
||||||
|
@ -314,6 +314,35 @@ void test_move_ctor_from_optional_U()
|
|||||||
BOOST_CHECK(b2->val == 4);
|
BOOST_CHECK(b2->val == 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void test_swap()
|
||||||
|
{
|
||||||
|
optional<MoveOnly> a((MoveOnly(2)));
|
||||||
|
optional<MoveOnly> b((MoveOnly(3)));
|
||||||
|
swap(a, b);
|
||||||
|
|
||||||
|
BOOST_CHECK(a->val == 3);
|
||||||
|
BOOST_CHECK(b->val == 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_optional_ref_to_movables()
|
||||||
|
{
|
||||||
|
MoveOnly m(3);
|
||||||
|
optional<MoveOnly&> orm = m;
|
||||||
|
orm->val = 2;
|
||||||
|
BOOST_CHECK(m.val == 2);
|
||||||
|
|
||||||
|
optional<MoveOnly&> orm2 = orm;
|
||||||
|
orm2->val = 1;
|
||||||
|
BOOST_CHECK(m.val == 1);
|
||||||
|
BOOST_CHECK(orm->val == 1);
|
||||||
|
|
||||||
|
optional<MoveOnly&> orm3 = boost::move(orm);
|
||||||
|
orm3->val = 4;
|
||||||
|
BOOST_CHECK(m.val == 4);
|
||||||
|
BOOST_CHECK(orm->val == 4);
|
||||||
|
BOOST_CHECK(orm2->val == 4);
|
||||||
|
}
|
||||||
|
|
||||||
// these 4 classes have different noexcept signatures in move operations
|
// these 4 classes have different noexcept signatures in move operations
|
||||||
struct NothrowBoth {
|
struct NothrowBoth {
|
||||||
NothrowBoth(NothrowBoth&&) BOOST_NOEXCEPT_IF(true) {};
|
NothrowBoth(NothrowBoth&&) BOOST_NOEXCEPT_IF(true) {};
|
||||||
@ -370,6 +399,8 @@ int test_main( int, char* [] )
|
|||||||
test_move_assign_from_optional_T();
|
test_move_assign_from_optional_T();
|
||||||
test_move_assign_from_optional_U();
|
test_move_assign_from_optional_U();
|
||||||
test_with_move_only();
|
test_with_move_only();
|
||||||
|
test_optional_ref_to_movables();
|
||||||
|
test_swap();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
catch ( ... )
|
catch ( ... )
|
||||||
|
Reference in New Issue
Block a user