Merge branch 'develop'

This commit is contained in:
Andrzej Krzemienski
2015-07-09 00:01:02 +02:00
10 changed files with 255 additions and 168 deletions

View File

@ -464,9 +464,10 @@ __SPACE__
* [*Requires:] `T` is __COPY_CONSTRUCTIBLE__ and `CopyAssignable`. * [*Requires:] `T` is __COPY_CONSTRUCTIBLE__ and `CopyAssignable`.
* [*Effects:] * [*Effects:]
[table [table
[[][`*this` contains a value][`*this` does not contain a value]] []
[[`rhs` contains a value][assigns `*rhs` to the contained value][initializes the contained value as if direct-initializing an object of type `T` with `*rhs`]] [[][[*`*this` contains a value]][[*`*this` does not contain a value]]]
[[`rhs` does not contain a value][destroys the contained value by calling `val->T::~T()`][no effect]] [[[*`rhs` contains a value]][assigns `*rhs` to the contained value][initializes the contained value as if direct-initializing an object of type `T` with `*rhs`]]
[[[*`rhs` does not contain a value]][destroys the contained value by calling `val->T::~T()`][no effect]]
] ]
* [*Returns:] `*this`; * [*Returns:] `*this`;
* [*Postconditions:] `bool(rhs) == bool(*this)`. * [*Postconditions:] `bool(rhs) == bool(*this)`.
@ -525,9 +526,10 @@ __SPACE__
* [*Requires:] `T` is __MOVE_CONSTRUCTIBLE__ and `MoveAssignable`. * [*Requires:] `T` is __MOVE_CONSTRUCTIBLE__ and `MoveAssignable`.
* [*Effects:] * [*Effects:]
[table [table
[[][`*this` contains a value][`*this` does not contain a value]] []
[[`rhs` contains a value][assigns `std::move(*rhs)` to the contained value][initializes the contained value as if direct-initializing an object of type `T` with `std::move(*rhs)`]] [[][[*`*this` contains a value]][[*`*this` does not contain a value]]]
[[`rhs` does not contain a value][destroys the contained value by calling `val->T::~T()`][no effect]] [[[*`rhs` contains a value]][assigns `std::move(*rhs)` to the contained value][initializes the contained value as if direct-initializing an object of type `T` with `std::move(*rhs)`]]
[[[*`rhs` does not contain a value]][destroys the contained value by calling `val->T::~T()`][no effect]]
] ]
* [*Returns:] `*this`; * [*Returns:] `*this`;
* [*Postconditions:] `bool(rhs) == bool(*this)`. * [*Postconditions:] `bool(rhs) == bool(*this)`.
@ -561,9 +563,10 @@ __SPACE__
* [*Effect:] * [*Effect:]
[table [table
[[][`*this` contains a value][`*this` does not contain a value]] []
[[`rhs` contains a value][assigns `*rhs` to the contained value][initializes the contained value as if direct-initializing an object of type `T` with `*rhs`]] [[][[*`*this` contains a value]][[*`*this` does not contain a value]]]
[[`rhs` does not contain a value][destroys the contained value by calling `val->T::~T()`][no effect]] [[[*`rhs` contains a value]][assigns `*rhs` to the contained value][initializes the contained value as if direct-initializing an object of type `T` with `*rhs`]]
[[[*`rhs` does not contain a value]][destroys the contained value by calling `val->T::~T()`][no effect]]
] ]
* [*Returns:] `*this`. * [*Returns:] `*this`.
* [*Postconditions:] `bool(rhs) == bool(*this)`. * [*Postconditions:] `bool(rhs) == bool(*this)`.
@ -588,9 +591,10 @@ __SPACE__
* [*Effect:] * [*Effect:]
[table [table
[[][`*this` contains a value][`*this` does not contain a value]] []
[[`rhs` contains a value][assigns `std::move(*rhs)` to the contained value][initializes the contained value as if direct-initializing an object of type `T` with `std::move(*rhs)`]] [[][[*`*this` contains a value]][[*`*this` does not contain a value]]]
[[`rhs` does not contain a value][destroys the contained value by calling `val->T::~T()`][no effect]] [[[*`rhs` contains a value]][assigns `std::move(*rhs)` to the contained value][initializes the contained value as if direct-initializing an object of type `T` with `std::move(*rhs)`]]
[[[*`rhs` does not contain a value]][destroys the contained value by calling `val->T::~T()`][no effect]]
] ]
* [*Returns:] `*this`. * [*Returns:] `*this`.
* [*Postconditions:] `bool(rhs) == bool(*this)`. * [*Postconditions:] `bool(rhs) == bool(*this)`.
@ -621,8 +625,10 @@ __SPACE__
of type `T` with `std::forward<Args>(args)...`. of type `T` with `std::forward<Args>(args)...`.
* [*Postconditions: ] `*this` is [_initialized]. * [*Postconditions: ] `*this` is [_initialized].
* [*Throws:] Whatever the selected `T`'s constructor throws. * [*Throws:] Whatever the selected `T`'s constructor throws.
* [*Notes:] `T` need not be __MOVE_CONSTRUCTIBLE__ or `MoveAssignable`. On compilers that do not support variadic templates, the signature falls back to single-argument: `template<class Arg> void emplace(Arg&& arg)`. On compilers that do not support rvalue references, the signature falls back to two overloads: taking `const` and non-`const` lvalue reference.
* [*Exception Safety:] If an exception is thrown during the initialization of `T`, `*this` is ['uninitialized]. * [*Exception Safety:] If an exception is thrown during the initialization of `T`, `*this` is ['uninitialized].
* [*Notes:] `T` need not be __MOVE_CONSTRUCTIBLE__ or `MoveAssignable`.
On compilers that do not support variadic templates, the signature falls back to two overloads:`template<class Arg> void emplace(Arg&& arg)` and `void emplace()`.
On compilers that do not support rvalue references, the signature falls back to three overloads: taking `const` and non-`const` lvalue reference, and third with empty function argument list.
* [*Example:] * [*Example:]
`` ``
T v; T v;
@ -1111,9 +1117,10 @@ __SPACE__
* [*Requires:] Lvalues of type `T` shall be swappable and `T` shall be __MOVE_CONSTRUCTIBLE__. * [*Requires:] Lvalues of type `T` shall be swappable and `T` shall be __MOVE_CONSTRUCTIBLE__.
* [*Effects:] * [*Effects:]
[table [table
[[][`*this` contains a value][`*this` does not contain a value]] []
[[`rhs` contains a value][calls `swap(*(*this), *rhs)`][initializes the contained value of `*this` as if direct-initializing an object of type `T` with the expression `std::move(*rhs)`, followed by `rhs.val->T::~T()`, `*this` contains a value and `rhs` does not contain a value]] [[][[*`*this` contains a value]][[*`*this` does not contain a value]]]
[[`rhs` does not contain a value][initializes the contained value of `rhs` as if direct-initializing an object of type `T` with the expression `std::move(*(*this))`, followed by `val->T::~T()`, `*this` does not contain a value and `rhs` contains a value][no effect]] [[[*`rhs` contains a value]][calls `swap(*(*this), *rhs)`][initializes the contained value of `*this` as if direct-initializing an object of type `T` with the expression `std::move(*rhs)`, followed by `rhs.val->T::~T()`, `*this` contains a value and `rhs` does not contain a value]]
[[[*`rhs` does not contain a value]][initializes the contained value of `rhs` as if direct-initializing an object of type `T` with the expression `std::move(*(*this))`, followed by `val->T::~T()`, `*this` does not contain a value and `rhs` contains a value][no effect]]
] ]
* [*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

View File

@ -11,12 +11,16 @@
[section:relnotes Release Notes] [section:relnotes Release Notes]
[heading Boost Release 1.59]
* For C++03 compilers, added 0-argument overload for member function `emplace()`, and therewith removed the dependency on `<boost/utility/in_place_factory.hpp>`.
[heading Boost Release 1.58] [heading Boost Release 1.58]
* `boost::none_t` is no longer convertible from literal `0`. This avoids a bug where `optional<rational<int>> oi = 0;` would initialize an optional object with no contained value. * `boost::none_t` is no longer convertible from literal `0`. This avoids a bug where `optional<rational<int>> oi = 0;` would initialize an optional object with no contained value.
* Improved the trick that prevents streaming out `optional` without header `optional_io.hpp` by using safe-bool idiom. This addresses [@https://svn.boost.org/trac/boost/ticket/10825 Trac #10825] * Improved the trick that prevents streaming out `optional` without header `optional_io.hpp` by using safe-bool idiom. This addresses [@https://svn.boost.org/trac/boost/ticket/10825 Trac #10825].
* IOStream operators are now mentioned in documentation. * IOStream operators are now mentioned in documentation.
* Added a way to manually disable move semantics: just define macro `BOOST_OPTIONAL_CONFIG_NO_RVALUE_REFERENCES`. This can be used to work around [@https://svn.boost.org/trac/boost/ticket/10399 Trac #10399] * Added a way to manually disable move semantics: just define macro `BOOST_OPTIONAL_CONFIG_NO_RVALUE_REFERENCES`. This can be used to work around [@https://svn.boost.org/trac/boost/ticket/10399 Trac #10399].
* It is no longer possible to assign `optional<U>` to `optional<T>` when `U` is not assignable or convertible to `T` ([@https://svn.boost.org/trac/boost/ticket/11087 Trac #11087]). * It is no longer possible to assign `optional<U>` to `optional<T>` when `U` is not assignable or convertible to `T` ([@https://svn.boost.org/trac/boost/ticket/11087 Trac #11087]).
* Value accessors now work correctly on rvalues of `optional<T&>` ([@https://svn.boost.org/trac/boost/ticket/10839 Trac #10839]). * Value accessors now work correctly on rvalues of `optional<T&>` ([@https://svn.boost.org/trac/boost/ticket/10839 Trac #10839]).

View File

@ -838,28 +838,27 @@
<col> <col>
<col> <col>
</colgroup> </colgroup>
<thead><tr> <thead><tr></tr></thead>
<th>
</th>
<th>
<p>
<code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
contains a value
</p>
</th>
<th>
<p>
<code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
does not contain a value
</p>
</th>
</tr></thead>
<tbody> <tbody>
<tr> <tr>
<td>
</td>
<td> <td>
<p> <p>
<code class="computeroutput"><span class="identifier">rhs</span></code> contains <span class="bold"><strong><code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> contains a value</strong></span>
a value </p>
</td>
<td>
<p>
<span class="bold"><strong><code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> does not contain a value</strong></span>
</p>
</td>
</tr>
<tr>
<td>
<p>
<span class="bold"><strong><code class="computeroutput"><span class="identifier">rhs</span></code>
contains a value</strong></span>
</p> </p>
</td> </td>
<td> <td>
@ -879,8 +878,8 @@
<tr> <tr>
<td> <td>
<p> <p>
<code class="computeroutput"><span class="identifier">rhs</span></code> does <span class="bold"><strong><code class="computeroutput"><span class="identifier">rhs</span></code>
not contain a value does not contain a value</strong></span>
</p> </p>
</td> </td>
<td> <td>
@ -995,28 +994,27 @@
<col> <col>
<col> <col>
</colgroup> </colgroup>
<thead><tr> <thead><tr></tr></thead>
<th>
</th>
<th>
<p>
<code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
contains a value
</p>
</th>
<th>
<p>
<code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
does not contain a value
</p>
</th>
</tr></thead>
<tbody> <tbody>
<tr> <tr>
<td>
</td>
<td> <td>
<p> <p>
<code class="computeroutput"><span class="identifier">rhs</span></code> contains <span class="bold"><strong><code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> contains a value</strong></span>
a value </p>
</td>
<td>
<p>
<span class="bold"><strong><code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> does not contain a value</strong></span>
</p>
</td>
</tr>
<tr>
<td>
<p>
<span class="bold"><strong><code class="computeroutput"><span class="identifier">rhs</span></code>
contains a value</strong></span>
</p> </p>
</td> </td>
<td> <td>
@ -1035,8 +1033,8 @@
<tr> <tr>
<td> <td>
<p> <p>
<code class="computeroutput"><span class="identifier">rhs</span></code> does <span class="bold"><strong><code class="computeroutput"><span class="identifier">rhs</span></code>
not contain a value does not contain a value</strong></span>
</p> </p>
</td> </td>
<td> <td>
@ -1117,28 +1115,27 @@
<col> <col>
<col> <col>
</colgroup> </colgroup>
<thead><tr> <thead><tr></tr></thead>
<th>
</th>
<th>
<p>
<code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
contains a value
</p>
</th>
<th>
<p>
<code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
does not contain a value
</p>
</th>
</tr></thead>
<tbody> <tbody>
<tr> <tr>
<td>
</td>
<td> <td>
<p> <p>
<code class="computeroutput"><span class="identifier">rhs</span></code> contains <span class="bold"><strong><code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> contains a value</strong></span>
a value </p>
</td>
<td>
<p>
<span class="bold"><strong><code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> does not contain a value</strong></span>
</p>
</td>
</tr>
<tr>
<td>
<p>
<span class="bold"><strong><code class="computeroutput"><span class="identifier">rhs</span></code>
contains a value</strong></span>
</p> </p>
</td> </td>
<td> <td>
@ -1158,8 +1155,8 @@
<tr> <tr>
<td> <td>
<p> <p>
<code class="computeroutput"><span class="identifier">rhs</span></code> does <span class="bold"><strong><code class="computeroutput"><span class="identifier">rhs</span></code>
not contain a value does not contain a value</strong></span>
</p> </p>
</td> </td>
<td> <td>
@ -1222,28 +1219,27 @@
<col> <col>
<col> <col>
</colgroup> </colgroup>
<thead><tr> <thead><tr></tr></thead>
<th>
</th>
<th>
<p>
<code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
contains a value
</p>
</th>
<th>
<p>
<code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
does not contain a value
</p>
</th>
</tr></thead>
<tbody> <tbody>
<tr> <tr>
<td>
</td>
<td> <td>
<p> <p>
<code class="computeroutput"><span class="identifier">rhs</span></code> contains <span class="bold"><strong><code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> contains a value</strong></span>
a value </p>
</td>
<td>
<p>
<span class="bold"><strong><code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> does not contain a value</strong></span>
</p>
</td>
</tr>
<tr>
<td>
<p>
<span class="bold"><strong><code class="computeroutput"><span class="identifier">rhs</span></code>
contains a value</strong></span>
</p> </p>
</td> </td>
<td> <td>
@ -1262,8 +1258,8 @@
<tr> <tr>
<td> <td>
<p> <p>
<code class="computeroutput"><span class="identifier">rhs</span></code> does <span class="bold"><strong><code class="computeroutput"><span class="identifier">rhs</span></code>
not contain a value does not contain a value</strong></span>
</p> </p>
</td> </td>
<td> <td>
@ -1336,23 +1332,26 @@
<li class="listitem"> <li class="listitem">
<span class="bold"><strong>Throws:</strong></span> Whatever the selected <code class="computeroutput"><span class="identifier">T</span></code>'s constructor throws. <span class="bold"><strong>Throws:</strong></span> Whatever the selected <code class="computeroutput"><span class="identifier">T</span></code>'s constructor throws.
</li> </li>
<li class="listitem">
<span class="bold"><strong>Notes:</strong></span> <code class="computeroutput"><span class="identifier">T</span></code>
need not be <code class="computeroutput"><span class="identifier">MoveConstructible</span></code>
or <code class="computeroutput"><span class="identifier">MoveAssignable</span></code>.
On compilers that do not support variadic templates, the signature
falls back to single-argument: <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span>
<span class="identifier">Arg</span><span class="special">&gt;</span>
<span class="keyword">void</span> <span class="identifier">emplace</span><span class="special">(</span><span class="identifier">Arg</span><span class="special">&amp;&amp;</span> <span class="identifier">arg</span><span class="special">)</span></code>. On compilers that do not support
rvalue references, the signature falls back to two overloads: taking
<code class="computeroutput"><span class="keyword">const</span></code> and non-<code class="computeroutput"><span class="keyword">const</span></code> lvalue reference.
</li>
<li class="listitem"> <li class="listitem">
<span class="bold"><strong>Exception Safety:</strong></span> If an exception <span class="bold"><strong>Exception Safety:</strong></span> If an exception
is thrown during the initialization of <code class="computeroutput"><span class="identifier">T</span></code>, is thrown during the initialization of <code class="computeroutput"><span class="identifier">T</span></code>,
<code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
is <span class="emphasis"><em>uninitialized</em></span>. is <span class="emphasis"><em>uninitialized</em></span>.
</li> </li>
<li class="listitem">
<span class="bold"><strong>Notes:</strong></span> <code class="computeroutput"><span class="identifier">T</span></code>
need not be <code class="computeroutput"><span class="identifier">MoveConstructible</span></code>
or <code class="computeroutput"><span class="identifier">MoveAssignable</span></code>.
On compilers that do not support variadic templates, the signature
falls back to two overloads:<code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span>
<span class="identifier">Arg</span><span class="special">&gt;</span>
<span class="keyword">void</span> <span class="identifier">emplace</span><span class="special">(</span><span class="identifier">Arg</span><span class="special">&amp;&amp;</span> <span class="identifier">arg</span><span class="special">)</span></code> and <code class="computeroutput"><span class="keyword">void</span>
<span class="identifier">emplace</span><span class="special">()</span></code>.
On compilers that do not support rvalue references, the signature falls
back to three overloads: taking <code class="computeroutput"><span class="keyword">const</span></code>
and non-<code class="computeroutput"><span class="keyword">const</span></code> lvalue reference,
and third with empty function argument list.
</li>
<li class="listitem"> <li class="listitem">
<span class="bold"><strong>Example:</strong></span> <span class="bold"><strong>Example:</strong></span>
<pre class="programlisting"><span class="identifier">T</span> <span class="identifier">v</span><span class="special">;</span> <pre class="programlisting"><span class="identifier">T</span> <span class="identifier">v</span><span class="special">;</span>
@ -2271,28 +2270,27 @@
<col> <col>
<col> <col>
</colgroup> </colgroup>
<thead><tr> <thead><tr></tr></thead>
<th>
</th>
<th>
<p>
<code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
contains a value
</p>
</th>
<th>
<p>
<code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
does not contain a value
</p>
</th>
</tr></thead>
<tbody> <tbody>
<tr> <tr>
<td>
</td>
<td> <td>
<p> <p>
<code class="computeroutput"><span class="identifier">rhs</span></code> contains <span class="bold"><strong><code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> contains a value</strong></span>
a value </p>
</td>
<td>
<p>
<span class="bold"><strong><code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> does not contain a value</strong></span>
</p>
</td>
</tr>
<tr>
<td>
<p>
<span class="bold"><strong><code class="computeroutput"><span class="identifier">rhs</span></code>
contains a value</strong></span>
</p> </p>
</td> </td>
<td> <td>
@ -2314,8 +2312,8 @@
<tr> <tr>
<td> <td>
<p> <p>
<code class="computeroutput"><span class="identifier">rhs</span></code> does <span class="bold"><strong><code class="computeroutput"><span class="identifier">rhs</span></code>
not contain a value does not contain a value</strong></span>
</p> </p>
</td> </td>
<td> <td>

View File

@ -28,6 +28,15 @@
</h2></div></div></div> </h2></div></div></div>
<h4> <h4>
<a name="boost_optional.relnotes.h0"></a> <a name="boost_optional.relnotes.h0"></a>
<span class="phrase"><a name="boost_optional.relnotes.boost_release_1_59"></a></span><a class="link" href="relnotes.html#boost_optional.relnotes.boost_release_1_59">Boost
Release 1.59</a>
</h4>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
For C++03 compilers, added 0-argument overload for member function <code class="computeroutput"><span class="identifier">emplace</span><span class="special">()</span></code>,
and therewith removed the dependency on <code class="computeroutput"><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">utility</span><span class="special">/</span><span class="identifier">in_place_factory</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span></code>.
</li></ul></div>
<h4>
<a name="boost_optional.relnotes.h1"></a>
<span class="phrase"><a name="boost_optional.relnotes.boost_release_1_58"></a></span><a class="link" href="relnotes.html#boost_optional.relnotes.boost_release_1_58">Boost <span class="phrase"><a name="boost_optional.relnotes.boost_release_1_58"></a></span><a class="link" href="relnotes.html#boost_optional.relnotes.boost_release_1_58">Boost
Release 1.58</a> Release 1.58</a>
</h4> </h4>
@ -42,7 +51,7 @@
Improved the trick that prevents streaming out <code class="computeroutput"><span class="identifier">optional</span></code> Improved the trick that prevents streaming out <code class="computeroutput"><span class="identifier">optional</span></code>
without header <code class="computeroutput"><span class="identifier">optional_io</span><span class="special">.</span><span class="identifier">hpp</span></code> without header <code class="computeroutput"><span class="identifier">optional_io</span><span class="special">.</span><span class="identifier">hpp</span></code>
by using safe-bool idiom. This addresses <a href="https://svn.boost.org/trac/boost/ticket/10825" target="_top">Trac by using safe-bool idiom. This addresses <a href="https://svn.boost.org/trac/boost/ticket/10825" target="_top">Trac
#10825</a> #10825</a>.
</li> </li>
<li class="listitem"> <li class="listitem">
IOStream operators are now mentioned in documentation. IOStream operators are now mentioned in documentation.
@ -50,7 +59,7 @@
<li class="listitem"> <li class="listitem">
Added a way to manually disable move semantics: just define macro <code class="computeroutput"><span class="identifier">BOOST_OPTIONAL_CONFIG_NO_RVALUE_REFERENCES</span></code>. Added a way to manually disable move semantics: just define macro <code class="computeroutput"><span class="identifier">BOOST_OPTIONAL_CONFIG_NO_RVALUE_REFERENCES</span></code>.
This can be used to work around <a href="https://svn.boost.org/trac/boost/ticket/10399" target="_top">Trac This can be used to work around <a href="https://svn.boost.org/trac/boost/ticket/10399" target="_top">Trac
#10399</a> #10399</a>.
</li> </li>
<li class="listitem"> <li class="listitem">
It is no longer possible to assign <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;</span></code> to <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code> when <code class="computeroutput"><span class="identifier">U</span></code> It is no longer possible to assign <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;</span></code> to <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code> when <code class="computeroutput"><span class="identifier">U</span></code>
@ -63,7 +72,7 @@
</li> </li>
</ul></div> </ul></div>
<h4> <h4>
<a name="boost_optional.relnotes.h1"></a> <a name="boost_optional.relnotes.h2"></a>
<span class="phrase"><a name="boost_optional.relnotes.boost_release_1_57"></a></span><a class="link" href="relnotes.html#boost_optional.relnotes.boost_release_1_57">Boost <span class="phrase"><a name="boost_optional.relnotes.boost_release_1_57"></a></span><a class="link" href="relnotes.html#boost_optional.relnotes.boost_release_1_57">Boost
Release 1.57</a> Release 1.57</a>
</h4> </h4>
@ -73,7 +82,7 @@
to fix C++03 compile error on <code class="computeroutput"><span class="identifier">logic_error</span><span class="special">(</span><span class="string">"..."</span><span class="special">)</span></code>"</em></span>. to fix C++03 compile error on <code class="computeroutput"><span class="identifier">logic_error</span><span class="special">(</span><span class="string">"..."</span><span class="special">)</span></code>"</em></span>.
</li></ul></div> </li></ul></div>
<h4> <h4>
<a name="boost_optional.relnotes.h2"></a> <a name="boost_optional.relnotes.h3"></a>
<span class="phrase"><a name="boost_optional.relnotes.boost_release_1_56"></a></span><a class="link" href="relnotes.html#boost_optional.relnotes.boost_release_1_56">Boost <span class="phrase"><a name="boost_optional.relnotes.boost_release_1_56"></a></span><a class="link" href="relnotes.html#boost_optional.relnotes.boost_release_1_56">Boost
Release 1.56</a> Release 1.56</a>
</h4> </h4>

View File

@ -146,7 +146,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: March 13, 2015 at 21:52:15 GMT</small></p></td> <td align="left"><p><small>Last revised: July 08, 2015 at 21:39:55 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>

View File

@ -18,12 +18,14 @@
#define BOOST_OPTIONAL_OPTIONAL_FLC_19NOV2002_HPP #define BOOST_OPTIONAL_OPTIONAL_FLC_19NOV2002_HPP
#include <new> #include <new>
#include <algorithm>
#include <iosfwd> #include <iosfwd>
#include <boost/config.hpp> #include <boost/config.hpp>
#include <boost/assert.hpp> #include <boost/assert.hpp>
#include <boost/core/addressof.hpp>
#include <boost/core/enable_if.hpp>
#include <boost/core/explicit_operator_bool.hpp> #include <boost/core/explicit_operator_bool.hpp>
#include <boost/core/swap.hpp>
#include <boost/optional/bad_optional_access.hpp> #include <boost/optional/bad_optional_access.hpp>
#include <boost/static_assert.hpp> #include <boost/static_assert.hpp>
#include <boost/throw_exception.hpp> #include <boost/throw_exception.hpp>
@ -47,13 +49,7 @@
#include <boost/detail/reference_content.hpp> #include <boost/detail/reference_content.hpp>
#include <boost/move/utility.hpp> #include <boost/move/utility.hpp>
#include <boost/none.hpp> #include <boost/none.hpp>
#include <boost/utility/addressof.hpp>
#include <boost/utility/compare_pointees.hpp> #include <boost/utility/compare_pointees.hpp>
#include <boost/utility/enable_if.hpp>
#include <boost/utility/in_place_factory.hpp>
#include <boost/utility/swap.hpp>
#include <boost/optional/optional_fwd.hpp> #include <boost/optional/optional_fwd.hpp>
@ -506,6 +502,13 @@ class optional_base : public optional_tag
::new (m_storage.address()) internal_type( boost::forward<Arg>(arg) ); ::new (m_storage.address()) internal_type( boost::forward<Arg>(arg) );
m_initialized = true ; m_initialized = true ;
} }
void emplace_assign ()
{
destroy();
::new (m_storage.address()) internal_type();
m_initialized = true ;
}
#else #else
template<class Arg> template<class Arg>
void emplace_assign ( const Arg& arg ) void emplace_assign ( const Arg& arg )
@ -515,13 +518,20 @@ class optional_base : public optional_tag
m_initialized = true ; m_initialized = true ;
} }
template<class Arg> template<class Arg>
void emplace_assign ( Arg& arg ) void emplace_assign ( Arg& arg )
{ {
destroy(); destroy();
::new (m_storage.address()) internal_type( arg ); ::new (m_storage.address()) internal_type( arg );
m_initialized = true ; m_initialized = true ;
} }
void emplace_assign ()
{
destroy();
::new (m_storage.address()) internal_type();
m_initialized = true ;
}
#endif #endif
#ifndef BOOST_OPTIONAL_NO_INPLACE_FACTORY_SUPPORT #ifndef BOOST_OPTIONAL_NO_INPLACE_FACTORY_SUPPORT
@ -976,6 +986,11 @@ class optional : public optional_detail::optional_base<T>
{ {
this->emplace_assign( boost::forward<Arg>(arg) ); this->emplace_assign( boost::forward<Arg>(arg) );
} }
void emplace ()
{
this->emplace_assign();
}
#else #else
template<class Arg> template<class Arg>
void emplace ( const Arg& arg ) void emplace ( const Arg& arg )
@ -988,6 +1003,11 @@ class optional : public optional_detail::optional_base<T>
{ {
this->emplace_assign( arg ); this->emplace_assign( arg );
} }
void emplace ()
{
this->emplace_assign();
}
#endif #endif
void swap( optional & arg ) void swap( optional & arg )
@ -1251,9 +1271,10 @@ get_pointer ( optional<T>& opt )
// The following declaration prevents a bug where operator safe-bool is used upon streaming optional object if you forget the IO header. // The following declaration prevents a bug where operator safe-bool is used upon streaming optional object if you forget the IO header.
template<class CharType, class CharTrait> template<class CharType, class CharTrait>
std::basic_ostream<CharType, CharTrait>& std::basic_ostream<CharType, CharTrait>&
operator<<(std::basic_ostream<CharType, CharTrait>& out, optional_detail::optional_tag const& v) operator<<(std::basic_ostream<CharType, CharTrait>& os, optional_detail::optional_tag const&)
{ {
BOOST_STATIC_ASSERT_MSG(sizeof(CharType) == 0, "If you want to output boost::optional, include header <boost/optional/optional_io.hpp>"); BOOST_STATIC_ASSERT_MSG(sizeof(CharType) == 0, "If you want to output boost::optional, include header <boost/optional/optional_io.hpp>");
return os;
} }
// optional's relational operators ( ==, !=, <, >, <=, >= ) have deep-semantics (compare values). // optional's relational operators ( ==, !=, <, >, <=, >= ) have deep-semantics (compare values).
@ -1448,9 +1469,9 @@ struct swap_selector<true>
return; return;
if( !hasX ) if( !hasX )
x = boost::in_place(); x.emplace();
else if ( !hasY ) else if ( !hasY )
y = boost::in_place(); y.emplace();
// Boost.Utility.Swap will take care of ADL and workarounds for broken compilers // Boost.Utility.Swap will take care of ADL and workarounds for broken compilers
boost::swap(x.get(),y.get()); boost::swap(x.get(),y.get());
@ -1523,9 +1544,18 @@ struct swap_selector<false>
} // namespace optional_detail } // namespace optional_detail
#if (!defined BOOST_NO_CXX11_RVALUE_REFERENCES) && (!defined BOOST_CONFIG_RESTORE_OBSOLETE_SWAP_IMPLEMENTATION)
template<class T>
struct optional_swap_should_use_default_constructor : boost::false_type {} ;
#else
template<class T> 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> {} ;
#endif //BOOST_NO_CXX11_RVALUE_REFERENCES
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_NOEXCEPT_EXPR(boost::swap(*x, *y))) //BOOST_NOEXCEPT_IF(::boost::is_nothrow_move_constructible<T>::value && BOOST_NOEXCEPT_EXPR(boost::swap(*x, *y)))
{ {

View File

@ -1,15 +1,16 @@
# Boost.Optional Library test Jamfile # Boost.Optional Library test Jamfile
# #
# Copyright (C) 2003, Fernando Luis Cacciola Carballal. # Copyright (C) 2003, Fernando Luis Cacciola Carballal.
# Copyright (C) 2014, 2015 Andrzej Krzemienski
# #
# This material is provided "as is", with absolutely no warranty expressed # Use, modification, and distribution is subject to the Boost Software
# or implied. Any use is at your own risk. # License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
# #
# Permission to use or copy this software for any purpose is hereby granted # See http://www.boost.org/libs/optional for documentation.
# without fee, provided the above notices are retained on all copies. #
# Permission to modify the code and to distribute modified code is granted, # You are welcome to contact the author at:
# provided the above notices are retained, and a notice that the code was # akrzemi1@gmail.com
# modified is included with the above copyright notice.
# #
import testing ; import testing ;

View File

@ -145,25 +145,62 @@ void test_clear_on_throw()
void test_no_assignment_on_emplacement() void test_no_assignment_on_emplacement()
{ {
optional<const std::string> os; optional<const std::string> os, ot;
BOOST_TEST(!os); BOOST_TEST(!os);
os.emplace("wow"); os.emplace("wow");
BOOST_TEST(os); BOOST_TEST(os);
BOOST_TEST_EQ(*os, "wow"); BOOST_TEST_EQ(*os, "wow");
BOOST_TEST(!ot);
ot.emplace();
BOOST_TEST(ot);
BOOST_TEST_EQ(*ot, "");
}
namespace no_rvalue_refs {
class Guard
{
public:
int which_ctor;
Guard () : which_ctor(0) { }
Guard (std::string const&) : which_ctor(5) { }
Guard (std::string &) : which_ctor(6) { }
private:
Guard(Guard const&);
void operator=(Guard const&);
};
void test_emplace()
{
const std::string cs;
std::string ms;
optional<Guard> o;
o.emplace();
BOOST_TEST(o);
BOOST_TEST(0 == o->which_ctor);
o.emplace(cs);
BOOST_TEST(o);
BOOST_TEST(5 == o->which_ctor);
o.emplace(ms);
BOOST_TEST(o);
BOOST_TEST(6 == o->which_ctor);
}
} }
int main() int main()
{ {
#if (!defined BOOST_NO_CXX11_RVALUE_REFERENCES) && (!defined BOOST_NO_CXX11_VARIADIC_TEMPLATES) #if (!defined BOOST_NO_CXX11_RVALUE_REFERENCES) && (!defined BOOST_NO_CXX11_VARIADIC_TEMPLATES)
test_emplace(); test_emplace();
#endif #endif
#if (!defined BOOST_NO_CXX11_RVALUE_REFERENCES) #if (!defined BOOST_NO_CXX11_RVALUE_REFERENCES)
test_no_moves_on_emplacement(); test_no_moves_on_emplacement();
#endif #endif
test_clear_on_throw(); test_clear_on_throw();
test_no_assignment_on_emplacement(); test_no_assignment_on_emplacement();
no_rvalue_refs::test_emplace();
return boost::report_errors(); return boost::report_errors();
} }

View File

@ -21,7 +21,7 @@ using boost::optional;
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
#ifndef BOOST_NO_NOEXCEPT #ifndef BOOST_NO_CXX11_NOEXCEPT
// these 4 classes have different noexcept signatures in move operations // these 4 classes have different noexcept signatures in move operations
struct NothrowBoth { struct NothrowBoth {
@ -105,7 +105,7 @@ void test_noexcept_optional_with_operator() // compile-time test
BOOST_STATIC_ASSERT(!BOOST_NOEXCEPT_EXPR( onx0 = ONx0() )); BOOST_STATIC_ASSERT(!BOOST_NOEXCEPT_EXPR( onx0 = ONx0() ));
} }
#endif // !defned BOOST_NO_NOEXCEPT #endif // !defned BOOST_NO_CXX11_NOEXCEPT
#endif // !defined BOOST_NO_CXX11_RVALUE_REFERENCES #endif // !defined BOOST_NO_CXX11_RVALUE_REFERENCES
int main() int main()

View File

@ -15,6 +15,7 @@
// //
#include "boost/optional/optional.hpp" #include "boost/optional/optional.hpp"
#include "boost/utility/in_place_factory.hpp"
#ifdef __BORLANDC__ #ifdef __BORLANDC__
#pragma hdrstop #pragma hdrstop