summaryrefslogtreecommitdiff
path: root/libs/optional
diff options
context:
space:
mode:
Diffstat (limited to 'libs/optional')
-rw-r--r--libs/optional/doc/00_optional.qbk31
-rw-r--r--libs/optional/doc/11_development.qbk2
-rw-r--r--libs/optional/doc/13_relational_operators.qbk2
-rw-r--r--libs/optional/doc/14_io.qbk37
-rw-r--r--libs/optional/doc/15_optional_references.qbk (renamed from libs/optional/doc/14_optional_references.qbk)0
-rw-r--r--libs/optional/doc/16_in_place_factories.qbk (renamed from libs/optional/doc/15_in_place_factories.qbk)0
-rw-r--r--libs/optional/doc/17_optional_bool.qbk (renamed from libs/optional/doc/16_optional_bool.qbk)0
-rw-r--r--libs/optional/doc/18_exception_safety.qbk (renamed from libs/optional/doc/17_exception_safety.qbk)0
-rw-r--r--libs/optional/doc/19_type_requirements.qbk (renamed from libs/optional/doc/18_type_requirements.qbk)0
-rw-r--r--libs/optional/doc/1A_on_performance.qbk131
-rw-r--r--libs/optional/doc/21_ref_none.qbk29
-rw-r--r--libs/optional/doc/22_ref_bad_optional_access.qbk40
-rw-r--r--libs/optional/doc/23_ref_optional_io.qbk74
-rw-r--r--libs/optional/doc/24_ref_optional_fwd.qbk32
-rw-r--r--libs/optional/doc/27_ref_optional_synopsis.qbk151
-rw-r--r--libs/optional/doc/28_ref_optional_semantics.qbk (renamed from libs/optional/doc/20_reference.qbk)227
-rw-r--r--libs/optional/doc/29_ref_optional_convenience.qbk17
-rw-r--r--libs/optional/doc/91_relnotes.qbk46
-rw-r--r--libs/optional/doc/92_acknowledgments.qbk (renamed from libs/optional/doc/91_acknowledgments.qbk)2
-rw-r--r--libs/optional/doc/Jamfile.v210
-rw-r--r--libs/optional/doc/html/boost_optional/acknowledgements.html8
-rw-r--r--libs/optional/doc/html/boost_optional/dependencies_and_portability.html8
-rw-r--r--libs/optional/doc/html/boost_optional/dependencies_and_portability/optional_reference_binding.html8
-rw-r--r--libs/optional/doc/html/boost_optional/quick_start.html2
-rw-r--r--libs/optional/doc/html/boost_optional/quick_start/bypassing_unnecessary_default_construction.html2
-rw-r--r--libs/optional/doc/html/boost_optional/quick_start/optional_automatic_variables.html2
-rw-r--r--libs/optional/doc/html/boost_optional/quick_start/optional_data_members.html2
-rw-r--r--libs/optional/doc/html/boost_optional/quick_start/storage_in_containers.html2
-rw-r--r--libs/optional/doc/html/boost_optional/reference/detailed_semantics.html2098
-rw-r--r--libs/optional/doc/html/boost_optional/reference/header__boost_optional_bad_optional_access_hpp_.html63
-rw-r--r--libs/optional/doc/html/boost_optional/reference/header__boost_optional_bad_optional_access_hpp_/detailed_semantics.html60
-rw-r--r--libs/optional/doc/html/boost_optional/reference/header__boost_optional_hpp_.html47
-rw-r--r--libs/optional/doc/html/boost_optional/reference/header__boost_optional_optional_fwd_hpp_.html66
-rw-r--r--libs/optional/doc/html/boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html2387
-rw-r--r--libs/optional/doc/html/boost_optional/reference/io_header.html72
-rw-r--r--libs/optional/doc/html/boost_optional/reference/io_header/io_semantics.html112
-rw-r--r--libs/optional/doc/html/boost_optional/relnotes.html144
-rw-r--r--libs/optional/doc/html/boost_optional/tutorial/a_note_about_optional_bool_.html2
-rw-r--r--libs/optional/doc/html/boost_optional/tutorial/design_overview.html2
-rw-r--r--libs/optional/doc/html/boost_optional/tutorial/design_overview/the_interface.html6
-rw-r--r--libs/optional/doc/html/boost_optional/tutorial/design_overview/the_semantics.html2
-rw-r--r--libs/optional/doc/html/boost_optional/tutorial/exception_safety_guarantees.html2
-rw-r--r--libs/optional/doc/html/boost_optional/tutorial/in_place_factories.html2
-rw-r--r--libs/optional/doc/html/boost_optional/tutorial/io_operators.html87
-rw-r--r--libs/optional/doc/html/boost_optional/tutorial/optional_references.html8
-rw-r--r--libs/optional/doc/html/boost_optional/tutorial/performance_considerations.html223
-rw-r--r--libs/optional/doc/html/boost_optional/tutorial/rebinding_semantics_for_assignment_of_optional_references.html2
-rw-r--r--libs/optional/doc/html/boost_optional/tutorial/relational_operators.html10
-rw-r--r--libs/optional/doc/html/boost_optional/tutorial/type_requirements.html8
-rw-r--r--libs/optional/doc/html/boost_optional/tutorial/when_to_use_optional.html2
-rw-r--r--libs/optional/doc/html/images/opt_align1.pngbin0 -> 417 bytes
-rw-r--r--libs/optional/doc/html/images/opt_align2.pngbin0 -> 472 bytes
-rw-r--r--libs/optional/doc/html/images/opt_align3.pngbin0 -> 468 bytes
-rw-r--r--libs/optional/doc/html/images/opt_align4.pngbin0 -> 428 bytes
-rw-r--r--libs/optional/doc/html/index.html27
-rw-r--r--libs/optional/doc/html/optional/reference.html174
-rw-r--r--libs/optional/doc/html/optional/reference/header__boost_optional_optional_hpp_.html (renamed from libs/optional/doc/html/boost_optional/reference/synopsis.html)151
-rw-r--r--libs/optional/doc/html/optional/tutorial.html5
-rw-r--r--libs/optional/doc/images/opt_align1.pngbin0 -> 417 bytes
-rw-r--r--libs/optional/doc/images/opt_align2.pngbin0 -> 472 bytes
-rw-r--r--libs/optional/doc/images/opt_align3.pngbin0 -> 468 bytes
-rw-r--r--libs/optional/doc/images/opt_align4.pngbin0 -> 428 bytes
-rw-r--r--libs/optional/meta/libraries.json5
-rw-r--r--libs/optional/test/Jamfile.v219
-rw-r--r--libs/optional/test/optional_ref_assign_test_defs.hpp197
-rw-r--r--libs/optional/test/optional_test.cpp369
-rw-r--r--libs/optional/test/optional_test_common.cpp2
-rw-r--r--libs/optional/test/optional_test_conversions_from_U.cpp111
-rw-r--r--libs/optional/test/optional_test_emplace.cpp92
-rw-r--r--libs/optional/test/optional_test_equals_none.cpp47
-rw-r--r--libs/optional/test/optional_test_fail_convert_assign_of_enums.cpp26
-rw-r--r--libs/optional/test/optional_test_fail_convert_from_null.cpp25
-rw-r--r--libs/optional/test/optional_test_fail_io_without_io.cpp24
-rw-r--r--libs/optional/test/optional_test_inplace.cpp84
-rw-r--r--libs/optional/test/optional_test_inplace_factory.cpp104
-rw-r--r--libs/optional/test/optional_test_inplace_fail.cpp67
-rw-r--r--libs/optional/test/optional_test_inplace_fail2.cpp69
-rw-r--r--libs/optional/test/optional_test_io.cpp94
-rw-r--r--libs/optional/test/optional_test_minimum_requirements.cpp67
-rw-r--r--libs/optional/test/optional_test_move.cpp260
-rw-r--r--libs/optional/test/optional_test_msvc_bug_workaround.cpp41
-rw-r--r--libs/optional/test/optional_test_noexcept_move.cpp116
-rw-r--r--libs/optional/test/optional_test_ref.cpp373
-rw-r--r--libs/optional/test/optional_test_ref_assign_const_int.cpp34
-rw-r--r--libs/optional/test/optional_test_ref_assign_mutable_int.cpp31
-rw-r--r--libs/optional/test/optional_test_ref_assign_portable_minimum.cpp44
-rw-r--r--libs/optional/test/optional_test_ref_convert_assign_const_int.cpp30
-rw-r--r--libs/optional/test/optional_test_ref_convert_assign_mutable_int.cpp29
-rw-r--r--libs/optional/test/optional_test_ref_convert_assign_non_int.cpp39
-rw-r--r--libs/optional/test/optional_test_ref_converting_ctor.cpp107
-rw-r--r--libs/optional/test/optional_test_ref_move.cpp69
-rw-r--r--libs/optional/test/optional_test_ref_portable_minimum.cpp448
-rw-r--r--libs/optional/test/optional_test_swap.cpp360
-rw-r--r--libs/optional/test/optional_test_the_compiler.cpp108
-rw-r--r--libs/optional/test/optional_test_tie.cpp84
-rw-r--r--libs/optional/test/optional_test_value_access.cpp116
-rw-r--r--libs/optional/test/testable_classes.hpp91
97 files changed, 6376 insertions, 4033 deletions
diff --git a/libs/optional/doc/00_optional.qbk b/libs/optional/doc/00_optional.qbk
index 7cc8565c6..d1a227547 100644
--- a/libs/optional/doc/00_optional.qbk
+++ b/libs/optional/doc/00_optional.qbk
@@ -2,7 +2,7 @@
[quickbook 1.4]
[authors [Cacciola Carballal, Fernando Luis]]
[copyright 2003-2007 Fernando Luis Cacciola Carballal]
- [copyright 2014 Andrzej Krzemieński]
+ [copyright 2014-2015 Andrzej Krzemieński]
[category miscellaneous]
[id optional]
[dirname optional]
@@ -54,7 +54,7 @@ Distributed under the Boost Software License, Version 1.0.
Class template `optional` is a wrapper for representing 'optional' (or 'nullable') objects who may not (yet) contain a valid value. Optional objects offer full value semantics; they are good for passing by value and usage inside STL containers. This is a header-only library.
[heading Problem]
-Suppose we want to read a parameter form a config file which represents some integral value, let's call it `"MaxValue"`. It is possible that this parameter is not specified; such situation is no error. It is valid to not specify the parameter and in that case the program is supposed to behave slightly differently. Also, suppose that any possible value of type `int` is a valid value for `"MaxValue"`, so we cannot jut use `-1` to represent the absence of the parameter in the config file.
+Suppose we want to read a parameter form a config file which represents some integral value, let's call it `"MaxValue"`. It is possible that this parameter is not specified; such situation is no error. It is valid to not specify the parameter and in that case the program is supposed to behave slightly differently. Also, suppose that any possible value of type `int` is a valid value for `"MaxValue"`, so we cannot just use `-1` to represent the absence of the parameter in the config file.
[heading Solution]
@@ -80,16 +80,27 @@ This is how you solve it with `boost::optional`:
[include 11_development.qbk]
[include 12_when_to_use.qbk]
[include 13_relational_operators.qbk]
-[include 14_optional_references.qbk]
-[include 15_in_place_factories.qbk]
-[include 16_optional_bool.qbk]
-[include 17_exception_safety.qbk]
-[include 18_type_requirements.qbk]
+[include 14_io.qbk]
+[include 15_optional_references.qbk]
+[include 16_in_place_factories.qbk]
+[include 17_optional_bool.qbk]
+[include 18_exception_safety.qbk]
+[include 19_type_requirements.qbk]
+[include 1A_on_performance.qbk]
[endsect]
-[section Reference]
-[include 20_reference.qbk]
+[section:reference Reference]
+[include 21_ref_none.qbk]
+[include 22_ref_bad_optional_access.qbk]
+[include 23_ref_optional_io.qbk]
+[include 24_ref_optional_fwd.qbk]
+[section Header <boost/optional/optional.hpp>]
+[include 27_ref_optional_synopsis.qbk]
+[include 28_ref_optional_semantics.qbk]
+[endsect]
+[include 29_ref_optional_convenience.qbk]
[endsect]
[include 90_dependencies.qbk]
-[include 91_acknowledgments.qbk]
+[include 91_relnotes.qbk]
+[include 92_acknowledgments.qbk]
diff --git a/libs/optional/doc/11_development.qbk b/libs/optional/doc/11_development.qbk
index d2f1b1f8e..9e3ef4489 100644
--- a/libs/optional/doc/11_development.qbk
+++ b/libs/optional/doc/11_development.qbk
@@ -171,7 +171,7 @@ Also, the presence of the possibly uninitialized state requires additional
operations not provided by `T` itself which are supported by a special interface.
[heading Lexically-hinted Value Access in the presence of possibly
-untitialized optional objects: The operators * and ->]
+uninitialized optional objects: The operators * and ->]
A relevant feature of a pointer is that it can have a [*null pointer value].
This is a ['special] value which is used to indicate that the pointer is not
diff --git a/libs/optional/doc/13_relational_operators.qbk b/libs/optional/doc/13_relational_operators.qbk
index e36dcf57e..861a4e86c 100644
--- a/libs/optional/doc/13_relational_operators.qbk
+++ b/libs/optional/doc/13_relational_operators.qbk
@@ -1,7 +1,7 @@

[section Relational operators]
-Type `optional<T>` is __SGI_EQUALITY_COMPARABLE__ whenever `T` is __SGI_EQUALITY_COMPARABLE__. Two optional objects containing a value compare in the same as their contained values. The uninitialized state of `optional<T>` is treated as a distinct value, equal to itself, and unequal to any value of type `T`:
+Type `optional<T>` is __SGI_EQUALITY_COMPARABLE__ whenever `T` is __SGI_EQUALITY_COMPARABLE__. Two optional objects containing a value compare in the same way as their contained values. The uninitialized state of `optional<T>` is treated as a distinct value, equal to itself, and unequal to any value of type `T`:
boost::optional<int> oN = boost::none;
boost::optional<int> o0 = 0;
diff --git a/libs/optional/doc/14_io.qbk b/libs/optional/doc/14_io.qbk
new file mode 100644
index 000000000..0fb4e894f
--- /dev/null
+++ b/libs/optional/doc/14_io.qbk
@@ -0,0 +1,37 @@
+
+[section IO operators]
+
+It is possible to use `optional<T>` with IO streams, provided that `T` can be used with streams. IOStream operators are defined in a separate header.
+
+``
+#include <iostream>
+#include <boost/optional/optional_io.hpp>
+
+int main()
+{
+ boost::optional<int> o1 = 1, oN = boost::none;
+ std::cout << o1;
+ std::cin >> oN;
+}
+``
+
+The current implementation does not guarantee any particular output. What it guarantees is that if streaming out and then back in `T` gives the same value, then streaming out and then back in `optional<T>` will also give back the same result:
+
+``
+#include <cassert>
+#include <sstream>
+#include <boost/optional/optional_io.hpp>
+
+int main()
+{
+ boost::optional<int> o1 = 1, oN = boost::none;
+ boost::optional<int> x1, x2;
+ std::stringstream s;
+ s << o1 << oN;
+ s >> x1 >> x2;
+ assert (o1 == x1);
+ assert (oN == x2);
+}
+``
+
+[endsect]
diff --git a/libs/optional/doc/14_optional_references.qbk b/libs/optional/doc/15_optional_references.qbk
index 2f8b3c634..2f8b3c634 100644
--- a/libs/optional/doc/14_optional_references.qbk
+++ b/libs/optional/doc/15_optional_references.qbk
diff --git a/libs/optional/doc/15_in_place_factories.qbk b/libs/optional/doc/16_in_place_factories.qbk
index d9df24d06..d9df24d06 100644
--- a/libs/optional/doc/15_in_place_factories.qbk
+++ b/libs/optional/doc/16_in_place_factories.qbk
diff --git a/libs/optional/doc/16_optional_bool.qbk b/libs/optional/doc/17_optional_bool.qbk
index 6f3664fe7..6f3664fe7 100644
--- a/libs/optional/doc/16_optional_bool.qbk
+++ b/libs/optional/doc/17_optional_bool.qbk
diff --git a/libs/optional/doc/17_exception_safety.qbk b/libs/optional/doc/18_exception_safety.qbk
index 331104b7a..331104b7a 100644
--- a/libs/optional/doc/17_exception_safety.qbk
+++ b/libs/optional/doc/18_exception_safety.qbk
diff --git a/libs/optional/doc/18_type_requirements.qbk b/libs/optional/doc/19_type_requirements.qbk
index 033a6eb3d..033a6eb3d 100644
--- a/libs/optional/doc/18_type_requirements.qbk
+++ b/libs/optional/doc/19_type_requirements.qbk
diff --git a/libs/optional/doc/1A_on_performance.qbk b/libs/optional/doc/1A_on_performance.qbk
new file mode 100644
index 000000000..841190f49
--- /dev/null
+++ b/libs/optional/doc/1A_on_performance.qbk
@@ -0,0 +1,131 @@
+
+[section Performance considerations]
+
+Technical details aside, the memory layout of `optional<T>` is more-less this:
+
+ template <typename T>
+ class optional
+ {
+ bool _initialized;
+ std::aligned_storage_t<sizeof(t), alignof(T)> _storage;
+ };
+
+But for the purpose of this analysis, considering memory layouts, we can think of it as:
+
+ template <typename T>
+ class optional
+ {
+ bool _initialized;
+ T _storage;
+ };
+
+Given type `optional<int>`, and assuming that `sizeof(int) == 4`, we will get `sizeof(optional<int>) == 8`. This is so because of the alignment rules, for our two members we get the following alignment:
+
+[$images/opt_align1.png]
+
+This means you can fit twice as many `int`s as `optional<int>`s into the same space of memory. Therefore, if the size of the objects is critical for your application (e.g., because you want to utilize your CPU cache in order to gain performance) and you have determined you are willing to trade the code clarity, it is recommended that you simply go with type `int` and use some 'magic value' to represent ['not-an-int].
+
+Even if you cannot spare any value of `int` to represent ['not-an-int] (e.g., because every value is useful, or you do want to signal ['not-an-int] explicitly), at least for `Trivial` types you should consider storing the value and the `bool` flag representing the ['null-state] separately. Consider the following class:
+
+ struct Record
+ {
+ optional<int> _min;
+ optional<int> _max;
+ };
+
+Its memory layout can be depicted as follows:
+
+[$images/opt_align2.png]
+
+This is exactly the same as if we had the following members:
+
+ struct Record
+ {
+ bool _has_min;
+ int _min;
+ bool _has_max;
+ int _max;
+ };
+
+But when they are stored separately, we at least have an option to reorder them like this:
+
+ struct Record
+ {
+ bool _has_min;
+ bool _has_max;
+ int _min;
+ int _max;
+ };
+
+Which gives us the following layout (and smaller total size):
+
+[$images/opt_align3.png]
+
+Sometimes it requires detailed consideration what data we make optional. In our case above, if we determine that both minimum and maximum value can be provided or not provided together, but one is never provided without the other, we can make only one optional memebr:
+
+ struct Limits
+ {
+ int _min;
+ int _max;
+ };
+
+ struct Record
+ {
+ optional<Limits> _limits;
+ };
+
+This would give us the following layout:
+
+[$images/opt_align4.png]
+
+[heading Optional function parameters]
+
+Having function parameters of type `const optional<T>&` may incur certain unexpected run-time cost connected to copy construction of `T`. Consider the following code.
+
+ void fun(const optional<Big>& v)
+ {
+ if (v) doSomethingWith(*v);
+ else doSomethingElse();
+ }
+
+ int main()
+ {
+ optional<Big> ov;
+ Big v;
+ fun(none);
+ fun(ov); // no copy
+ fun(v); // copy constructor of Big
+ }
+
+No copy elision or move semantics can save us from copying type `Big` here. Not that we need any copy, but this is how `optional` works. In order to avoid copying in this case, one could provide second overload of `fun`:
+
+ void fun(const Big& v)
+ {
+ doSomethingWith(v);
+ }
+
+ int main()
+ {
+ optional<Big> ov;
+ Big v;
+ fun(ov); // no copy
+ fun(v); // no copy: second overload selected
+ }
+
+Alternatively, you could consider using an optional reference instead:
+
+ void fun(optional<const Big&> v) // note where the reference is
+ {
+ if (v) doSomethingWith(*v);
+ else doSomethingElse();
+ }
+
+ int main()
+ {
+ optional<Big> ov;
+ Big v;
+ fun(none);
+ fun(ov); // doesn't compile
+ fun(v); // no copy
+ }
+[endsect]
diff --git a/libs/optional/doc/21_ref_none.qbk b/libs/optional/doc/21_ref_none.qbk
new file mode 100644
index 000000000..e3b921efc
--- /dev/null
+++ b/libs/optional/doc/21_ref_none.qbk
@@ -0,0 +1,29 @@
+[/
+ Boost.Optional
+
+ Copyright (c) 2003-2007 Fernando Luis Cacciola Carballal
+ Copyright (c) 2015 Andrzej Krzemienski
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or copy at
+ http://www.boost.org/LICENSE_1_0.txt)
+]
+
+[section Header <boost/none.hpp>]
+
+[section Synopsis]
+```
+namespace boost {
+
+class none_t {};
+
+extern const none_t none; // see below
+
+} // namespace boost
+```
+
+Variable `none` has external linkage, however it is not required to link with any library to obtain its definition. Only by including this header file, the definition becomes available, by means of using template instantiation.
+
+[endsect]
+
+[endsect]
diff --git a/libs/optional/doc/22_ref_bad_optional_access.qbk b/libs/optional/doc/22_ref_bad_optional_access.qbk
new file mode 100644
index 000000000..e92913478
--- /dev/null
+++ b/libs/optional/doc/22_ref_bad_optional_access.qbk
@@ -0,0 +1,40 @@
+[/
+ Boost.Optional
+
+ Copyright (c) 2003-2007 Fernando Luis Cacciola Carballal
+ Copyright (c) 2015 Andrzej Krzemienski
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or copy at
+ http://www.boost.org/LICENSE_1_0.txt)
+]
+
+[section Header <boost/optional/bad_optional_access.hpp>]
+
+[section Synopsis]
+```
+namespace boost {
+
+class bad_optional_access : public std::logic_error
+{
+public:
+ bad_optional_access(); ``[link reference_bad_optional_access_constructor __GO_TO__]``
+};
+
+} // namespace boost
+```
+[endsect]
+
+[section Detailed semantics]
+
+__SPACE__
+
+[#reference_bad_optional_access_constructor]
+
+`bad_optional_access();`
+
+* [*Effect:] Constructs an object of class `bad_optional_access`.
+* [*Postconditions:] `what()` returns an implementation-defined NTBS.
+
+[endsect]
+[endsect]
diff --git a/libs/optional/doc/23_ref_optional_io.qbk b/libs/optional/doc/23_ref_optional_io.qbk
new file mode 100644
index 000000000..a9425d465
--- /dev/null
+++ b/libs/optional/doc/23_ref_optional_io.qbk
@@ -0,0 +1,74 @@
+[/
+ Boost.Optional
+
+ Copyright (c) 2003-2007 Fernando Luis Cacciola Carballal
+ Copyright (c) 2015 Andrzej Krzemienski
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or copy at
+ http://www.boost.org/LICENSE_1_0.txt)
+]
+
+[section:io_header Header <boost/optional/optional_io.hpp>]
+
+[section:io_synop Synopsis]
+```
+#include <istream>
+#include <ostream>
+#include <boost/optional/optional.hpp>
+
+namespace boost {
+
+template <class CharType, class CharTrait, class T>
+ std::basic_ostream<CharType, CharTrait>&
+ operator<<(std::basic_ostream<CharType, CharTrait>& out, optional<T> const& v); ``[link reference_operator_ostream __GO_TO__]``
+
+ template <class CharType, class CharTrait>
+ std::basic_ostream<CharType, CharTrait>&
+ operator<<(std::basic_ostream<CharType, CharTrait>& out, none_t const&); ``[link reference_operator_ostream_none __GO_TO__]``
+
+template<class CharType, class CharTrait, class T>
+ std::basic_istream<CharType, CharTrait>&
+ operator>>(std::basic_istream<CharType, CharTrait>& in, optional<T>& v); ``[link reference_operator_istream __GO_TO__]``
+
+} // namespace boost
+```
+
+[endsect]
+
+[section:io_semantics Detailed semantics]
+
+
+[#reference_operator_ostream]
+
+
+`template <class CharType, class CharTrait, class T>` [br]
+\u00A0\u00A0\u00A0\u00A0`std::basic_ostream<CharType, CharTrait>&` [br]
+\u00A0\u00A0\u00A0\u00A0`operator<<(std::basic_ostream<CharType, CharTrait>& out, optional<T> const& v);`
+
+* [*Effect:] Outputs an implementation-defined string. The output contains the information about whether the optional object contains a value or not. If `v` contains a value, the output contains result of calling `out << *v`.
+* [*Returns:] `out`.
+
+__SPACE__
+[#reference_operator_ostream_none]
+
+`template <class CharType, class CharTrait, class T>` [br]
+\u00A0\u00A0\u00A0\u00A0`std::basic_ostream<CharType, CharTrait>&` [br]
+\u00A0\u00A0\u00A0\u00A0`operator<<(std::basic_ostream<CharType, CharTrait>& out, none_t);`
+
+* [*Effect:] Outputs an implementation-defined string.
+* [*Returns:] `out`.
+
+__SPACE__
+[#reference_operator_istream]
+
+`template <class CharType, class CharTrait, class T>` [br]
+\u00A0\u00A0\u00A0\u00A0`std::basic_ostream<CharType, CharTrait>&` [br]
+\u00A0\u00A0\u00A0\u00A0`operator>>(std::basic_istream<CharType, CharTrait>& in, optional<T>& v);`
+
+* [*Requires:] `T` is __SGI_DEFAULT_CONSTRUCTIBLE__ and __MOVE_CONSTRUCTIBLE__.
+* [*Effect:] Reads the value of optional object from `in`. If the string representation indicates that the optional object should contain a value, `v` contains a value and its contained value is obtained as if by default-constructing an object `o` of type `T` and then calling `in >> o`; otherwise `v` does not contain a value, and the previously contained value (if any) has been destroyed.
+* [*Returns:] `out`.
+
+[endsect]
+[endsect]
diff --git a/libs/optional/doc/24_ref_optional_fwd.qbk b/libs/optional/doc/24_ref_optional_fwd.qbk
new file mode 100644
index 000000000..03187f943
--- /dev/null
+++ b/libs/optional/doc/24_ref_optional_fwd.qbk
@@ -0,0 +1,32 @@
+[/
+ Boost.Optional
+
+ Copyright (c) 2003-2007 Fernando Luis Cacciola Carballal
+ Copyright (c) 2015 Andrzej Krzemienski
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or copy at
+ http://www.boost.org/LICENSE_1_0.txt)
+]
+
+[section Header <boost/optional/optional_fwd.hpp>]
+
+[section Synopsis]
+```
+namespace boost {
+
+template <class T> class optional ;
+
+template <class T> void swap ( optional<T>& , optional<T>& );
+
+template <class T> struct optional_swap_should_use_default_constructor ;
+
+} // namespace boost
+```
+
+This header only contains declarations.
+
+[endsect]
+
+
+[endsect]
diff --git a/libs/optional/doc/27_ref_optional_synopsis.qbk b/libs/optional/doc/27_ref_optional_synopsis.qbk
new file mode 100644
index 000000000..042dd3dc2
--- /dev/null
+++ b/libs/optional/doc/27_ref_optional_synopsis.qbk
@@ -0,0 +1,151 @@
+[/
+ Boost.Optional
+
+ Copyright (c) 2003-2007 Fernando Luis Cacciola Carballal
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or copy at
+ http://www.boost.org/LICENSE_1_0.txt)
+]
+
+
+[#ref_header_optional_optional_hpp][section:header_optional_optional Synopsis]
+
+ ```// In Header: <`[@boost:/boost/optional/optional.hpp boost/optional/optional.hpp]'''<phrase role="comment">&gt;</phrase>'''``
+
+ namespace boost {
+
+ template <class T>
+ class optional
+ {
+ public :
+
+ typedef T value_type;
+
+ // (If T is of reference type, the parameters and results by reference are by value)
+
+ optional () noexcept ; ``[link reference_optional_constructor __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&& v ) ; ``[link reference_optional_constructor_move_value __GO_TO__]``
+
+ // [new in 1.34]
+ 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&& 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>&& 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 TypedInPlaceFactory> explicit optional ( TypedInPlaceFactory const& f ) ; ``[link reference_optional_constructor_factory __GO_TO__]``
+
+ optional& operator = ( none_t ) noexcept ; ``[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&& 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&& 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>&& rhs ) ; ``[link reference_optional_operator_move_equal_other_optional __GO_TO__]``
+
+ template<class... Args> void emplace ( Args...&& args ) ; ``[link reference_optional_emplace __GO_TO__]``
+
+ template<class InPlaceFactory> optional& operator = ( InPlaceFactory const& f ) ; ``[link reference_optional_operator_equal_factory __GO_TO__]``
+
+ template<class TypedInPlaceFactory> optional& operator = ( TypedInPlaceFactory const& f ) ; ``[link reference_optional_operator_equal_factory __GO_TO__]``
+
+ T const& get() const ; ``[link reference_optional_get __GO_TO__]``
+ T& get() ; ``[link reference_optional_get __GO_TO__]``
+
+ T const* operator ->() const ; ``[link reference_optional_operator_arrow __GO_TO__]``
+ T* operator ->() ; ``[link reference_optional_operator_arrow __GO_TO__]``
+
+ T const& operator *() const& ; ``[link reference_optional_operator_asterisk __GO_TO__]``
+ T& operator *() & ; ``[link reference_optional_operator_asterisk __GO_TO__]``
+ T&& operator *() && ; ``[link reference_optional_operator_asterisk_move __GO_TO__]``
+
+ T const& value() const& ; ``[link reference_optional_value __GO_TO__]``
+ T& value() & ; ``[link reference_optional_value __GO_TO__]``
+ T&& value() && ; ``[link reference_optional_value_move __GO_TO__]``
+
+ template<class U> T value_or( U && v ) const& ; ``[link reference_optional_value_or __GO_TO__]``
+ template<class U> T value_or( U && v ) && ; ``[link reference_optional_value_or_move __GO_TO__]``
+
+ template<class F> T value_or_eval( F f ) const& ; ``[link reference_optional_value_or_call __GO_TO__]``
+ template<class F> T value_or_eval( F f ) && ; ``[link reference_optional_value_or_call_move __GO_TO__]``
+
+ T const* get_ptr() const ; ``[link reference_optional_get_ptr __GO_TO__]``
+ T* get_ptr() ; ``[link reference_optional_get_ptr __GO_TO__]``
+
+ explicit operator bool() const noexcept ; ``[link reference_optional_operator_bool __GO_TO__]``
+
+ bool operator!() const noexcept ; ``[link reference_optional_operator_not __GO_TO__]``
+
+ // deprecated methods
+
+ // (deprecated)
+ void reset() noexcept ; ``[link reference_optional_reset __GO_TO__]``
+
+ // (deprecated)
+ void reset ( T const& ) ; ``[link reference_optional_reset_value __GO_TO__]``
+
+ // (deprecated)
+ bool is_initialized() const ; ``[link reference_optional_is_initialized __GO_TO__]``
+
+ // (deprecated)
+ T const& get_value_or( T const& default ) const ; ``[link reference_optional_get_value_or_value __GO_TO__]``
+ };
+
+ template<class T> inline bool operator == ( optional<T> const& x, optional<T> const& y ) ; ``[link reference_operator_compare_equal_optional_optional __GO_TO__]``
+
+ template<class T> inline bool operator != ( optional<T> const& x, optional<T> const& y ) ; ``[link reference_operator_compare_not_equal_optional_optional __GO_TO__]``
+
+ template<class T> inline bool operator < ( optional<T> const& x, optional<T> const& y ) ; ``[link reference_operator_compare_less_optional_optional __GO_TO__]``
+
+ template<class T> inline bool operator > ( optional<T> const& x, optional<T> const& y ) ; ``[link reference_operator_compare_greater_optional_optional __GO_TO__]``
+
+ template<class T> inline bool operator <= ( optional<T> const& x, optional<T> const& y ) ; ``[link reference_operator_compare_less_or_equal_optional_optional __GO_TO__]``
+
+ template<class T> inline bool operator >= ( optional<T> const& x, optional<T> const& y ) ; ``[link reference_operator_compare_greater_or_equal_optional_optional __GO_TO__]``
+
+ template<class T> inline bool operator == ( optional<T> const& x, none_t ) noexcept ; ``[link reference_operator_compare_equal_optional_none __GO_TO__]``
+
+ template<class T> inline bool operator != ( optional<T> const& x, none_t ) noexcept ; ``[link reference_operator_compare_not_equal_optional_none __GO_TO__]``
+
+ template<class T> inline optional<T> make_optional ( T const& v ) ; ``[link reference_make_optional_value __GO_TO__]``
+
+ template<class T> inline optional<T> make_optional ( bool condition, T const& v ) ; ``[link reference_make_optional_bool_value __GO_TO__]``
+
+ template<class T> inline T const& get_optional_value_or ( optional<T> const& opt, T const& default ) ; ``[link reference_optional_get_value_or_value __GO_TO__]``
+
+ template<class T> inline T const& get ( optional<T> const& opt ) ; ``[link reference_optional_get __GO_TO__]``
+
+ template<class T> inline T& get ( optional<T> & opt ) ; ``[link reference_optional_get __GO_TO__]``
+
+ template<class T> inline T const* get ( optional<T> const* opt ) ; ``[link reference_optional_get __GO_TO__]``
+
+ template<class T> inline T* get ( optional<T>* opt ) ; ``[link reference_optional_get __GO_TO__]``
+
+ template<class T> inline T const* get_pointer ( optional<T> const& opt ) ; ``[link reference_optional_get_ptr __GO_TO__]``
+
+ template<class T> inline T* get_pointer ( optional<T> & opt ) ; ``[link reference_optional_get_ptr __GO_TO__]``
+
+ template<class T> inline void swap( optional<T>& x, optional<T>& y ) ; ``[link reference_swap_optional_optional __GO_TO__]``
+
+ } // namespace boost
+
+
+[endsect]
diff --git a/libs/optional/doc/20_reference.qbk b/libs/optional/doc/28_ref_optional_semantics.qbk
index cba3bac90..07f7a43c4 100644
--- a/libs/optional/doc/20_reference.qbk
+++ b/libs/optional/doc/28_ref_optional_semantics.qbk
@@ -9,145 +9,6 @@
]
-[section Synopsis]
-
- ```// In Header: <`[@boost:/boost/optional/optional.hpp boost/optional/optional.hpp]'''<phrase role="comment">&gt;</phrase>'''``
-
- namespace boost {
-
- template<class T>
- class optional
- {
- public :
-
- // (If T is of reference type, the parameters and results by reference are by value)
-
- optional () noexcept ; ``[link reference_optional_constructor __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&& v ) ; ``[link reference_optional_constructor_move_value __GO_TO__]``
-
- // [new in 1.34]
- 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&& 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>&& 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 TypedInPlaceFactory> explicit optional ( TypedInPlaceFactory const& f ) ; ``[link reference_optional_constructor_factory __GO_TO__]``
-
- optional& operator = ( none_t ) noexcept ; ``[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&& 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&& 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>&& rhs ) ; ``[link reference_optional_operator_move_equal_other_optional __GO_TO__]``
-
- template<class... Args> void emplace ( Args...&& args ) ; ``[link reference_optional_emplace __GO_TO__]``
-
- template<class InPlaceFactory> optional& operator = ( InPlaceFactory const& f ) ; ``[link reference_optional_operator_equal_factory __GO_TO__]``
-
- template<class TypedInPlaceFactory> optional& operator = ( TypedInPlaceFactory const& f ) ; ``[link reference_optional_operator_equal_factory __GO_TO__]``
-
- T const& get() const ; ``[link reference_optional_get __GO_TO__]``
- T& get() ; ``[link reference_optional_get __GO_TO__]``
-
- T const* operator ->() const ; ``[link reference_optional_operator_arrow __GO_TO__]``
- T* operator ->() ; ``[link reference_optional_operator_arrow __GO_TO__]``
-
- T const& operator *() const& ; ``[link reference_optional_operator_asterisk __GO_TO__]``
- T& operator *() & ; ``[link reference_optional_operator_asterisk __GO_TO__]``
- T&& operator *() && ; ``[link reference_optional_operator_asterisk_move __GO_TO__]``
-
- T const& value() const& ; ``[link reference_optional_value __GO_TO__]``
- T& value() & ; ``[link reference_optional_value __GO_TO__]``
- T&& value() && ; ``[link reference_optional_value_move __GO_TO__]``
-
- template<class U> T value_or( U && v ) const& ; ``[link reference_optional_value_or __GO_TO__]``
- template<class U> T value_or( U && v ) && ; ``[link reference_optional_value_or_move __GO_TO__]``
-
- template<class F> T value_or_eval( F f ) const& ; ``[link reference_optional_value_or_call __GO_TO__]``
- template<class F> T value_or_eval( F f ) && ; ``[link reference_optional_value_or_call_move __GO_TO__]``
-
- T const* get_ptr() const ; ``[link reference_optional_get_ptr __GO_TO__]``
- T* get_ptr() ; ``[link reference_optional_get_ptr __GO_TO__]``
-
- explicit operator bool() const noexcept ; ``[link reference_optional_operator_bool __GO_TO__]``
-
- bool operator!() const noexcept ; ``[link reference_optional_operator_not __GO_TO__]``
-
- // deprecated methods
-
- // (deprecated)
- void reset() noexcept ; ``[link reference_optional_reset __GO_TO__]``
-
- // (deprecated)
- void reset ( T const& ) ; ``[link reference_optional_reset_value __GO_TO__]``
-
- // (deprecated)
- bool is_initialized() const ; ``[link reference_optional_is_initialized __GO_TO__]``
-
- // (deprecated)
- T const& get_value_or( T const& default ) const ; ``[link reference_optional_get_value_or_value __GO_TO__]``
- };
-
- template<class T> inline bool operator == ( optional<T> const& x, optional<T> const& y ) ; ``[link reference_operator_compare_equal_optional_optional __GO_TO__]``
-
- template<class T> inline bool operator != ( optional<T> const& x, optional<T> const& y ) ; ``[link reference_operator_compare_not_equal_optional_optional __GO_TO__]``
-
- template<class T> inline bool operator < ( optional<T> const& x, optional<T> const& y ) ; ``[link reference_operator_compare_less_optional_optional __GO_TO__]``
-
- template<class T> inline bool operator > ( optional<T> const& x, optional<T> const& y ) ; ``[link reference_operator_compare_greater_optional_optional __GO_TO__]``
-
- template<class T> inline bool operator <= ( optional<T> const& x, optional<T> const& y ) ; ``[link reference_operator_compare_less_or_equal_optional_optional __GO_TO__]``
-
- template<class T> inline bool operator >= ( optional<T> const& x, optional<T> const& y ) ; ``[link reference_operator_compare_greater_or_equal_optional_optional __GO_TO__]``
-
- template<class T> inline bool operator == ( optional<T> const& x, none_t ) noexcept ; ``[link reference_operator_compare_equal_optional_none __GO_TO__]``
-
- template<class T> inline bool operator != ( optional<T> const& x, none_t ) noexcept ; ``[link reference_operator_compare_not_equal_optional_none __GO_TO__]``
-
- template<class T> inline optional<T> make_optional ( T const& v ) ; ``[link reference_make_optional_value __GO_TO__]``
-
- template<class T> inline optional<T> make_optional ( bool condition, T const& v ) ; ``[link reference_make_optional_bool_value __GO_TO__]``
-
- template<class T> inline T const& get_optional_value_or ( optional<T> const& opt, T const& default ) ; ``[link reference_optional_get_value_or_value __GO_TO__]``
-
- template<class T> inline T const& get ( optional<T> const& opt ) ; ``[link reference_optional_get __GO_TO__]``
-
- template<class T> inline T& get ( optional<T> & opt ) ; ``[link reference_optional_get __GO_TO__]``
-
- template<class T> inline T const* get ( optional<T> const* opt ) ; ``[link reference_optional_get __GO_TO__]``
-
- template<class T> inline T* get ( optional<T>* opt ) ; ``[link reference_optional_get __GO_TO__]``
-
- template<class T> inline T const* get_pointer ( optional<T> const& opt ) ; ``[link reference_optional_get_ptr __GO_TO__]``
-
- template<class T> inline T* get_pointer ( optional<T> & opt ) ; ``[link reference_optional_get_ptr __GO_TO__]``
-
- template<class T> inline void swap( optional<T>& x, optional<T>& y ) ; ``[link reference_swap_optional_optional __GO_TO__]``
-
- } // namespace boost
-
-
-[endsect]
-
[section Detailed Semantics]
Because `T` might be of reference type, in the sequel, those entries whose
@@ -602,10 +463,11 @@ __SPACE__
* [*Requires:] `T` is __COPY_CONSTRUCTIBLE__ and `CopyAssignable`.
* [*Effects:]
- * If `!*this && !rhs` no effect, otherwise
- * if `bool(*this) && !rhs`, destroys the contained value by calling `val->T::~T()`, otherwise
- * if `!*this && bool(rhs)`, initializes the contained value as if direct-initializing an object of type `T` with `*rhs`, otherwise
- * (if `bool(*this) && bool(rhs)`) assigns `*rhs` to the contained value.
+[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`]]
+ [[`rhs` does not contain a value][destroys the contained value by calling `val->T::~T()`][no effect]]
+]
* [*Returns:] `*this`;
* [*Postconditions:] `bool(rhs) == bool(*this)`.
* [*Exception Safety:] If any exception is thrown, the initialization state of `*this` and `rhs` remains unchanged.
@@ -662,10 +524,11 @@ __SPACE__
* [*Requires:] `T` is __MOVE_CONSTRUCTIBLE__ and `MoveAssignable`.
* [*Effects:]
- * If `!*this && !rhs` no effect, otherwise
- * if `bool(*this) && !rhs`, destroys the contained value by calling `val->T::~T()`, otherwise
- * if `!*this && bool(rhs)`, initializes the contained value as if direct-initializing an object of type `T` with `std::move(*rhs)`, otherwise
- * (if `bool(*this) && bool(rhs)`) assigns `std::move(*rhs)` to the contained value.
+[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)`]]
+ [[`rhs` does not contain a value][destroys the contained value by calling `val->T::~T()`][no effect]]
+]
* [*Returns:] `*this`;
* [*Postconditions:] `bool(rhs) == bool(*this)`.
* [*Remarks:] The expression inside `noexcept` is equivalent to `is_nothrow_move_constructible<T>::value && is_nothrow_move_assignable<T>::value`.
@@ -696,21 +559,17 @@ __SPACE__
[: `template<U> optional& optional<T` ['(not a ref)]`>::operator= ( optional<U> const& rhs ) ;`]
-* [*Effect:] Assigns another convertible optional to an optional.
-* [*Postconditions:] If `rhs` is initialized, `*this` is initialized and
-its value is a ['copy] of the value of `rhs` ['converted] to type `T`; else
-`*this` is uninitialized.
-* [*Throws:] Whatever `T::operator=( U const& )` or `T::T( U const& )` 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.
+* [*Effect:]
+[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`]]
+ [[`rhs` does not contain a value][destroys the contained value by calling `val->T::~T()`][no effect]]
+]
+* [*Returns:] `*this`.
+* [*Postconditions:] `bool(rhs) == bool(*this)`.
+* [*Exception Safety:] If any exception is thrown, the result of the expression `bool(*this)` remains unchanged.
+If an exception is thrown during the call to `T`'s constructor, no effect.
+If an exception is thrown during the call to `T`'s assignment, the state of its contained value is as defined by the exception safety guarantee of `T`'s copy assignment.
* [*Example:]
``
T v;
@@ -727,21 +586,17 @@ __SPACE__
[: `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.
+* [*Effect:]
+[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)`]]
+ [[`rhs` does not contain a value][destroys the contained value by calling `val->T::~T()`][no effect]]
+]
+* [*Returns:] `*this`.
+* [*Postconditions:] `bool(rhs) == bool(*this)`.
+* [*Exception Safety:] If any exception is thrown, the result of the expression `bool(*this)` remains unchanged.
+If an exception is thrown during the call to `T`'s constructor, no effect.
+If an exception is thrown during the call to `T`'s assignment, the state of its contained value is as defined by the exception safety guarantee of `T`'s copy assignment.
* [*Example:]
``
T v;
@@ -1143,9 +998,8 @@ __SPACE__
* [*Requires:] `T` shall meet requirements of __SGI_EQUALITY_COMPARABLE__.
* [*Returns:] If both `x` and `y` are initialized, `(*x == *y)`. If only
`x` or `y` is initialized, `false`. If both are uninitialized, `true`.
-* [*Notes:] Pointers have shallow relational operators while `optional` has
-deep relational operators. Do not use `operator==` directly in generic
-code which expect to be given either an `optional<T>` or a pointer; use
+* [*Notes:] This definition guarantees that `optional<T>` not containing a value is compared unequal to any `optional<T>` containing any value, and equal to any other `optional<T>` not containing a value.
+Pointers have shallow relational operators while `optional` has deep relational operators. Do not use `operator==` directly in generic code which expect to be given either an `optional<T>` or a pointer; use
__FUNCTION_EQUAL_POINTEES__ instead
* [*Example:]
``
@@ -1172,8 +1026,8 @@ __SPACE__
* [*Requires:] Expression `*x < *y` shall be well-formed and its result shall be convertible to `bool`.
* [*Returns:] `(!y) ? false : (!x) ? true : *x < *y`.
-* [*Notes:] Pointers have shallow relational operators while `optional` has
-deep relational operators. Do not use `operator<` directly in generic code
+* [*Notes:] This definition guarantees that `optional<T>` not containing a value is ordered as less than any `optional<T>` containing any value, and equivalent to any other `optional<T>` not containing a value.
+Pointers have shallow relational operators while `optional` has deep relational operators. Do not use `operator<` directly in generic code
which expect to be given either an `optional<T>` or a pointer; use __FUNCTION_LESS_POINTEES__ instead. `T` need not be __SGI_LESS_THAN_COMPARABLE__. Only single `operator<` is required. Other relational operations are defined in terms of this one. If `T`'s `operator<` satisfies the axioms of __SGI_LESS_THAN_COMPARABLE__ (transitivity, antisymmetry and irreflexivity), `optinal<T>` is __SGI_LESS_THAN_COMPARABLE__.
* [*Example:]
``
@@ -1256,10 +1110,11 @@ __SPACE__
* [*Requires:] Lvalues of type `T` shall be swappable and `T` shall be __MOVE_CONSTRUCTIBLE__.
* [*Effects:]
- * If `!*this && !rhs`, no effect, otherwise
- * if `bool(*this) && !rhs`, 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, otherwise
- * if `!*this && bool(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, otherwise
- * (if `bool(*this) && bool(rhs)`) calls `swap(*(*this), *rhs)`.
+[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]]
+ [[`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.
* [*Throws:] If both are initialized, whatever `swap(T&,T&)` throws. If only
one is initialized, whatever `T::T ( T&& )` throws.
diff --git a/libs/optional/doc/29_ref_optional_convenience.qbk b/libs/optional/doc/29_ref_optional_convenience.qbk
new file mode 100644
index 000000000..63b4732a3
--- /dev/null
+++ b/libs/optional/doc/29_ref_optional_convenience.qbk
@@ -0,0 +1,17 @@
+[/
+ Boost.Optional
+
+ Copyright (c) 2003-2007 Fernando Luis Cacciola Carballal
+ Copyright (c) 2015 Andrzej Krzemienski
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or copy at
+ http://www.boost.org/LICENSE_1_0.txt)
+]
+
+[section Header <boost/optional.hpp>]
+
+This is an alias for header [link boost_optional.reference.header__boost_optional_optional_hpp_.header_optional_optional `<boost/optional/optional.hpp>`].
+
+
+[endsect]
diff --git a/libs/optional/doc/91_relnotes.qbk b/libs/optional/doc/91_relnotes.qbk
new file mode 100644
index 000000000..e75fef7d5
--- /dev/null
+++ b/libs/optional/doc/91_relnotes.qbk
@@ -0,0 +1,46 @@
+[/
+ Boost.Optional
+
+ Copyright (c) 2015 Andrzej Krzemienski
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or copy at
+ http://www.boost.org/LICENSE_1_0.txt)
+]
+
+
+[section:relnotes Release Notes]
+
+[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.
+* 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.
+* 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]).
+* Value accessors now work correctly on rvalues of `optional<T&>` ([@https://svn.boost.org/trac/boost/ticket/10839 Trac #10839]).
+
+
+[heading Boost Release 1.57]
+
+* [@https://github.com/boostorg/optional/pull/9 Git pull #9]: ['"Supply `<string>` to fix C++03 compile error on `logic_error("...")`"].
+
+
+[heading Boost Release 1.56]
+
+* Added support for rvalue references. Now `optional<T>` works with moveable but non-copyable `T`'s,
+* Improved `swap` (now uses move operations),
+* Added function `emplace()`. This is the last of the requests from [@https://svn.boost.org/trac/boost/ticket/1841 Trac #1841],
+* `optional` is moveable, including conditional `noexcept` specifications, which make it `move_if_noexcept`-friendly,
+* Using explicit operator bool() on platforms that support it ([@https://svn.boost.org/trac/boost/ticket/4227 Trac #4227]) (breaking change),
+* Forward declaration of `operator<<(ostream&, optional const&)` to prevent inadvertent incorrect serialization of optional objects,
+* Removed deprecated function `reset()` from examples ([@https://svn.boost.org/trac/boost/ticket/9005 Trac #9005]),
+* Equality comparison with `boost::none` does not require that `T` be EqualityComparable,
+* Optional rvalue references are explicitly disallowed,
+* Binding temporaries to optional references is explicitly disallowed (breaking change),
+* More ways to access the contained value, functions `value()`, `value_or()`, `value_or_eval()`,
+* Updated and reorganized documentation, added tutorial and quick guide sections.
+
+
+
+[endsect][/ relnotes]
diff --git a/libs/optional/doc/91_acknowledgments.qbk b/libs/optional/doc/92_acknowledgments.qbk
index cb1b3bb57..f337ce27d 100644
--- a/libs/optional/doc/91_acknowledgments.qbk
+++ b/libs/optional/doc/92_acknowledgments.qbk
@@ -9,7 +9,7 @@
]
-[section Acknowledgements]
+[section:acknowledgements Acknowledgements]
[heading Pre-formal review]
diff --git a/libs/optional/doc/Jamfile.v2 b/libs/optional/doc/Jamfile.v2
index debb1b4a7..fc306647a 100644
--- a/libs/optional/doc/Jamfile.v2
+++ b/libs/optional/doc/Jamfile.v2
@@ -20,6 +20,16 @@ xml optional
00_optional.qbk
;
+install images
+ :
+ images/opt_align1.png
+ images/opt_align2.png
+ images/opt_align3.png
+ images/opt_align4.png
+ :
+ <location>html/images
+ ;
+
boostbook standalone
:
optional
diff --git a/libs/optional/doc/html/boost_optional/acknowledgements.html b/libs/optional/doc/html/boost_optional/acknowledgements.html
index 659795dbb..d025d5075 100644
--- a/libs/optional/doc/html/boost_optional/acknowledgements.html
+++ b/libs/optional/doc/html/boost_optional/acknowledgements.html
@@ -6,7 +6,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="../index.html" title="Boost.Optional">
<link rel="up" href="../index.html" title="Boost.Optional">
-<link rel="prev" href="dependencies_and_portability/optional_reference_binding.html" title="Optional Reference Binding">
+<link rel="prev" href="relnotes.html" title="Release Notes">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
@@ -19,7 +19,7 @@
</tr></table>
<hr>
<div class="spirit-nav">
-<a accesskey="p" href="dependencies_and_portability/optional_reference_binding.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a>
+<a accesskey="p" href="relnotes.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
@@ -116,7 +116,7 @@
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
-<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014 Andrzej Krzemie&#324;ski<p>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014, 2015 Andrzej Krzemie&#324;ski<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>
@@ -124,7 +124,7 @@
</tr></table>
<hr>
<div class="spirit-nav">
-<a accesskey="p" href="dependencies_and_portability/optional_reference_binding.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a>
+<a accesskey="p" href="relnotes.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a>
</div>
</body>
</html>
diff --git a/libs/optional/doc/html/boost_optional/dependencies_and_portability.html b/libs/optional/doc/html/boost_optional/dependencies_and_portability.html
index b99d3b1d6..7c3063717 100644
--- a/libs/optional/doc/html/boost_optional/dependencies_and_portability.html
+++ b/libs/optional/doc/html/boost_optional/dependencies_and_portability.html
@@ -6,7 +6,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="../index.html" title="Boost.Optional">
<link rel="up" href="../index.html" title="Boost.Optional">
-<link rel="prev" href="reference/detailed_semantics.html" title="Detailed Semantics">
+<link rel="prev" href="reference/header__boost_optional_hpp_.html" title="Header &lt;boost/optional.hpp&gt;">
<link rel="next" href="dependencies_and_portability/optional_reference_binding.html" title="Optional Reference Binding">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -20,7 +20,7 @@
</tr></table>
<hr>
<div class="spirit-nav">
-<a accesskey="p" href="reference/detailed_semantics.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="dependencies_and_portability/optional_reference_binding.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
+<a accesskey="p" href="reference/header__boost_optional_hpp_.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="dependencies_and_portability/optional_reference_binding.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
@@ -75,7 +75,7 @@
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
-<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014 Andrzej Krzemie&#324;ski<p>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014, 2015 Andrzej Krzemie&#324;ski<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>
@@ -83,7 +83,7 @@
</tr></table>
<hr>
<div class="spirit-nav">
-<a accesskey="p" href="reference/detailed_semantics.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="dependencies_and_portability/optional_reference_binding.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
+<a accesskey="p" href="reference/header__boost_optional_hpp_.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="dependencies_and_portability/optional_reference_binding.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>
diff --git a/libs/optional/doc/html/boost_optional/dependencies_and_portability/optional_reference_binding.html b/libs/optional/doc/html/boost_optional/dependencies_and_portability/optional_reference_binding.html
index b27d9c1f1..bb9f5d6ec 100644
--- a/libs/optional/doc/html/boost_optional/dependencies_and_portability/optional_reference_binding.html
+++ b/libs/optional/doc/html/boost_optional/dependencies_and_portability/optional_reference_binding.html
@@ -7,7 +7,7 @@
<link rel="home" href="../../index.html" title="Boost.Optional">
<link rel="up" href="../dependencies_and_portability.html" title="Dependencies and Portability">
<link rel="prev" href="../dependencies_and_portability.html" title="Dependencies and Portability">
-<link rel="next" href="../acknowledgements.html" title="Acknowledgements">
+<link rel="next" href="../relnotes.html" title="Release Notes">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
@@ -20,7 +20,7 @@
</tr></table>
<hr>
<div class="spirit-nav">
-<a accesskey="p" href="../dependencies_and_portability.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../dependencies_and_portability.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../acknowledgements.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
+<a accesskey="p" href="../dependencies_and_portability.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../dependencies_and_portability.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../relnotes.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
@@ -86,7 +86,7 @@
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
-<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014 Andrzej Krzemie&#324;ski<p>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014, 2015 Andrzej Krzemie&#324;ski<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>
@@ -94,7 +94,7 @@
</tr></table>
<hr>
<div class="spirit-nav">
-<a accesskey="p" href="../dependencies_and_portability.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../dependencies_and_portability.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../acknowledgements.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
+<a accesskey="p" href="../dependencies_and_portability.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../dependencies_and_portability.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../relnotes.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>
diff --git a/libs/optional/doc/html/boost_optional/quick_start.html b/libs/optional/doc/html/boost_optional/quick_start.html
index 18ee7c297..d6b1c3964 100644
--- a/libs/optional/doc/html/boost_optional/quick_start.html
+++ b/libs/optional/doc/html/boost_optional/quick_start.html
@@ -155,7 +155,7 @@
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
-<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014 Andrzej Krzemie&#324;ski<p>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014, 2015 Andrzej Krzemie&#324;ski<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>
diff --git a/libs/optional/doc/html/boost_optional/quick_start/bypassing_unnecessary_default_construction.html b/libs/optional/doc/html/boost_optional/quick_start/bypassing_unnecessary_default_construction.html
index ed964cf30..1d75a3f5b 100644
--- a/libs/optional/doc/html/boost_optional/quick_start/bypassing_unnecessary_default_construction.html
+++ b/libs/optional/doc/html/boost_optional/quick_start/bypassing_unnecessary_default_construction.html
@@ -61,7 +61,7 @@
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
-<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014 Andrzej Krzemie&#324;ski<p>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014, 2015 Andrzej Krzemie&#324;ski<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>
diff --git a/libs/optional/doc/html/boost_optional/quick_start/optional_automatic_variables.html b/libs/optional/doc/html/boost_optional/quick_start/optional_automatic_variables.html
index 8d22f8642..bde643c72 100644
--- a/libs/optional/doc/html/boost_optional/quick_start/optional_automatic_variables.html
+++ b/libs/optional/doc/html/boost_optional/quick_start/optional_automatic_variables.html
@@ -61,7 +61,7 @@
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
-<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014 Andrzej Krzemie&#324;ski<p>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014, 2015 Andrzej Krzemie&#324;ski<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>
diff --git a/libs/optional/doc/html/boost_optional/quick_start/optional_data_members.html b/libs/optional/doc/html/boost_optional/quick_start/optional_data_members.html
index abb558914..1a1a3b078 100644
--- a/libs/optional/doc/html/boost_optional/quick_start/optional_data_members.html
+++ b/libs/optional/doc/html/boost_optional/quick_start/optional_data_members.html
@@ -80,7 +80,7 @@
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
-<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014 Andrzej Krzemie&#324;ski<p>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014, 2015 Andrzej Krzemie&#324;ski<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>
diff --git a/libs/optional/doc/html/boost_optional/quick_start/storage_in_containers.html b/libs/optional/doc/html/boost_optional/quick_start/storage_in_containers.html
index f13f5a77d..295fcce18 100644
--- a/libs/optional/doc/html/boost_optional/quick_start/storage_in_containers.html
+++ b/libs/optional/doc/html/boost_optional/quick_start/storage_in_containers.html
@@ -50,7 +50,7 @@
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
-<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014 Andrzej Krzemie&#324;ski<p>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014, 2015 Andrzej Krzemie&#324;ski<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>
diff --git a/libs/optional/doc/html/boost_optional/reference/detailed_semantics.html b/libs/optional/doc/html/boost_optional/reference/detailed_semantics.html
deleted file mode 100644
index dfbfc871f..000000000
--- a/libs/optional/doc/html/boost_optional/reference/detailed_semantics.html
+++ /dev/null
@@ -1,2098 +0,0 @@
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
-<title>Detailed Semantics</title>
-<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css">
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
-<link rel="home" href="../../index.html" title="Boost.Optional">
-<link rel="up" href="../../optional/reference.html" title="Reference">
-<link rel="prev" href="../../optional/reference.html" title="Reference">
-<link rel="next" href="../dependencies_and_portability.html" title="Dependencies and Portability">
-</head>
-<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table cellpadding="2" width="100%"><tr>
-<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td>
-<td align="center"><a href="../../../../../../index.html">Home</a></td>
-<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td>
-<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
-<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
-<td align="center"><a href="../../../../../../more/index.htm">More</a></td>
-</tr></table>
-<hr>
-<div class="spirit-nav">
-<a accesskey="p" href="../../optional/reference.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../optional/reference.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../dependencies_and_portability.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
-</div>
-<div class="section">
-<div class="titlepage"><div><div><h3 class="title">
-<a name="boost_optional.reference.detailed_semantics"></a><a class="link" href="detailed_semantics.html" title="Detailed Semantics">Detailed
- Semantics</a>
-</h3></div></div></div>
-<p>
- Because <code class="computeroutput"><span class="identifier">T</span></code> might be of reference
- type, in the sequel, those entries whose semantic depends on <code class="computeroutput"><span class="identifier">T</span></code> being of reference type or not will be
- distinguished using the following convention:
- </p>
-<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
-<li class="listitem">
- If the entry reads: <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code><span class="emphasis"><em>(not
- a ref)</em></span><code class="computeroutput"><span class="special">&gt;</span></code>, the
- description corresponds only to the case where <code class="computeroutput"><span class="identifier">T</span></code>
- is not of reference type.
- </li>
-<li class="listitem">
- If the entry reads: <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span></code>, the description corresponds
- only to the case where <code class="computeroutput"><span class="identifier">T</span></code>
- is of reference type.
- </li>
-<li class="listitem">
- If the entry reads: <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code>, the description is the same for
- both cases.
- </li>
-</ul></div>
-<div class="note"><table border="0" summary="Note">
-<tr>
-<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../doc/src/images/note.png"></td>
-<th align="left">Note</th>
-</tr>
-<tr><td align="left" valign="top"><p>
- The following section contains various <code class="computeroutput"><span class="identifier">assert</span><span class="special">()</span></code> which are used only to show the postconditions
- as sample code. It is not implied that the type <code class="computeroutput"><span class="identifier">T</span></code>
- must support each particular expression but that if the expression is supported,
- the implied condition holds.
- </p></td></tr>
-</table></div>
-<p>
- <span class="inlinemediaobject"><img src="../../images/space.png" alt="space"></span>
- </p>
-<h5>
-<a name="boost_optional.reference.detailed_semantics.h0"></a>
- <span class="phrase"><a name="boost_optional.reference.detailed_semantics.optional_class_member_functions"></a></span><a class="link" href="detailed_semantics.html#boost_optional.reference.detailed_semantics.optional_class_member_functions">optional
- class member functions</a>
- </h5>
-<p>
- <span class="inlinemediaobject"><img src="../../images/space.png" alt="space"></span>
- </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">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">optional</span><span class="special">()</span>
- <span class="keyword">noexcept</span><span class="special">;</span></code>
- </p></blockquote></div>
-<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
-<li class="listitem">
- <span class="bold"><strong>Effect:</strong></span> Default-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">uninitialized</span>.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Notes:</strong></span> T's default constructor <span class="underline">is not</span> called.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Example:</strong></span>
-<pre class="programlisting"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">def</span> <span class="special">;</span>
-<span class="identifier">assert</span> <span class="special">(</span> <span class="special">!</span><span class="identifier">def</span> <span class="special">)</span> <span class="special">;</span>
-</pre>
- </li>
-</ul></div>
-<p>
- <span class="inlinemediaobject"><img src="../../images/space.png" alt="space"></span>
- </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">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">optional</span><span class="special">(</span> <span class="identifier">none_t</span> <span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span></code>
- </p></blockquote></div>
-<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
-<li class="listitem">
- <span class="bold"><strong>Effect:</strong></span> Constructs an <code class="computeroutput"><span class="identifier">optional</span></code> uninitialized.
- </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">uninitialized</span>.
- </li>
-<li class="listitem">
- <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.
- The expression <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">none</span></code>
- denotes an instance of <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">none_t</span></code>
- that can be used as the parameter.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Example:</strong></span>
-<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">none</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
-<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">n</span><span class="special">(</span><span class="identifier">none</span><span class="special">)</span> <span class="special">;</span>
-<span class="identifier">assert</span> <span class="special">(</span> <span class="special">!</span><span class="identifier">n</span> <span class="special">)</span> <span class="special">;</span>
-</pre>
- </li>
-</ul></div>
-<p>
- <span class="inlinemediaobject"><img src="../../images/space.png" alt="space"></span>
- </p>
-<a name="reference_optional_constructor_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span> </code><span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">optional</span><span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">v</span> <span class="special">)</span></code>
- </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_copy_constructible</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</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-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 a <span class="emphasis"><em>copy</em></span> of <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="keyword">const</span><span class="special">&amp;</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="keyword">const</span><span class="special">&amp;</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="keyword">const</span><span class="special">&amp;</span> <span class="special">);</span></code>
- in that case, this constructor has no effect.
- </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">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">opt</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span>
-<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">opt</span> <span class="special">==</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span>
-</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">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;::</span><span class="identifier">optional</span><span class="special">(</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">ref</span> <span class="special">)</span></code>
- </p></blockquote></div>
-<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
-<li class="listitem">
- <span class="bold"><strong>Effect:</strong></span> Directly-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 an instance of an internal type wrapping the reference
- <code class="computeroutput"><span class="identifier">ref</span></code>.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Throws:</strong></span> Nothing.
- </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">T</span><span class="special">&amp;</span> <span class="identifier">vref</span> <span class="special">=</span> <span class="identifier">v</span> <span class="special">;</span>
-<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span> <span class="identifier">opt</span><span class="special">(</span><span class="identifier">vref</span><span class="special">);</span>
-<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">opt</span> <span class="special">==</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span>
-<span class="special">++</span> <span class="identifier">v</span> <span class="special">;</span> <span class="comment">// mutate referee</span>
-<span class="identifier">assert</span> <span class="special">(*</span><span class="identifier">opt</span> <span class="special">==</span> <span class="identifier">v</span><span class="special">);</span>
-</pre>
- </li>
-</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">&lt;</span><span class="identifier">T</span> </code><span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">optional</span><span class="special">(</span> <span class="identifier">T</span><span class="special">&amp;&amp;</span>
- <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">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</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">&amp;&amp;</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">&amp;&amp;</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">&amp;&amp;</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">&amp;&amp;)</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">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">opt</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">v1</span><span class="special">));</span>
-<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">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;::</span><span class="identifier">optional</span><span class="special">(</span> <span class="identifier">T</span><span class="special">&amp;&amp;</span>
- <span class="identifier">ref</span> <span class="special">)</span>
- <span class="special">=</span> <span class="keyword">delete</span></code>
- </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>
- <span class="inlinemediaobject"><img src="../../images/space.png" alt="space"></span>
- </p>
-<a name="reference_optional_constructor_bool_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">optional</span><span class="special">(</span> <span class="keyword">bool</span> <span class="identifier">condition</span><span class="special">,</span>
- <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span></code>
- </p></blockquote></div>
-<div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span>
- <span class="special">::</span><span class="identifier">optional</span><span class="special">(</span> <span class="keyword">bool</span> <span class="identifier">condition</span><span class="special">,</span>
- <span class="identifier">T</span><span class="special">&amp;</span>
- <span class="identifier">v</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">
- If condition is true, same as:
- </li></ul></div>
-<div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">optional</span><span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">v</span> <span class="special">)</span></code>
- </p></blockquote></div>
-<div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span>
- <span class="special">::</span><span class="identifier">optional</span><span class="special">(</span> <span class="identifier">T</span><span class="special">&amp;</span>
- <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">
- otherwise, same as:
- </li></ul></div>
-<div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span> </code><span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">optional</span><span class="special">()</span></code>
- </p></blockquote></div>
-<div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span>
- <span class="special">::</span><span class="identifier">optional</span><span class="special">()</span></code>
- </p></blockquote></div>
-<p>
- <span class="inlinemediaobject"><img src="../../images/space.png" alt="space"></span>
- </p>
-<a name="reference_optional_constructor_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span> </code><span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">optional</span><span class="special">(</span> <span class="identifier">optional</span>
- <span class="keyword">const</span><span class="special">&amp;</span>
- <span class="identifier">rhs</span> <span class="special">);</span></code>
- </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_copy_constructible</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</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> Copy-Constructs an <code class="computeroutput"><span class="identifier">optional</span></code>.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Postconditions:</strong></span> If rhs is initialized,
- <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
- is initialized and its value is a <span class="emphasis"><em>copy</em></span> of 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="identifier">T</span><span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">)</span></code> throws.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Notes:</strong></span> If rhs is initialized, <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">)</span></code>
- 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="keyword">const</span><span class="special">&amp;</span> <span class="special">);</span></code>
- in that case, this constructor has no effect.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Example:</strong></span>
-<pre class="programlisting"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">uninit</span> <span class="special">;</span>
-<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">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">uinit2</span> <span class="special">(</span> <span class="identifier">uninit</span> <span class="special">)</span> <span class="special">;</span>
-<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">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">init</span><span class="special">(</span> <span class="identifier">T</span><span class="special">(</span><span class="number">2</span><span class="special">)</span> <span class="special">);</span>
-<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">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">init2</span> <span class="special">(</span> <span class="identifier">init</span> <span class="special">)</span> <span class="special">;</span>
-<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">init2</span> <span class="special">==</span> <span class="identifier">init</span> <span class="special">)</span> <span class="special">;</span>
-</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">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;::</span><span class="identifier">optional</span><span class="special">(</span> <span class="identifier">optional</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rhs</span> <span class="special">);</span></code>
- </p></blockquote></div>
-<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
-<li class="listitem">
- <span class="bold"><strong>Effect:</strong></span> Copy-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 refer 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">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</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">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span> <span class="identifier">uinit2</span> <span class="special">(</span> <span class="identifier">uninit</span> <span class="special">)</span> <span class="special">;</span>
-<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">T</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">2</span> <span class="special">;</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">ref</span> <span class="special">=</span> <span class="identifier">v</span> <span class="special">;</span>
-<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">init</span><span class="special">(</span><span class="identifier">ref</span><span class="special">);</span>
-<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">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">init2</span> <span class="special">(</span> <span class="identifier">init</span> <span class="special">)</span> <span class="special">;</span>
-<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="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>
- <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">&lt;</span><span class="identifier">T</span> </code><span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">optional</span><span class="special">(</span> <span class="identifier">optional</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span>
- <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">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</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">&amp;&amp;</span> <span class="special">)</span></code>
- throws.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Remarks:</strong></span> 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">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span></code>.
- </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">&amp;&amp;</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">&amp;&amp;</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">&amp;&amp;)</span></code>.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Example:</strong></span>
-<pre class="programlisting"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">unique_ptr</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&gt;</span> <span class="identifier">uninit</span> <span class="special">;</span>
-<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">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">unique_ptr</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&gt;</span> <span class="identifier">uinit2</span> <span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">uninit</span><span class="special">)</span> <span class="special">)</span> <span class="special">;</span>
-<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">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">unique_ptr</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&gt;</span> <span class="identifier">init</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">uniqye_ptr</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;(</span><span class="keyword">new</span> <span class="identifier">T</span><span class="special">(</span><span class="number">2</span><span class="special">))</span> <span class="special">);</span>
-<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">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">unique_ptr</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&gt;</span> <span class="identifier">init2</span> <span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">init</span><span class="special">)</span> <span class="special">)</span> <span class="special">;</span>
-<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">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;::</span><span class="identifier">optional</span><span class="special">(</span> <span class="identifier">optional</span> <span class="special">&amp;&amp;</span>
- <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 refer 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">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">unique_ptr</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&amp;&gt;</span> <span class="identifier">uninit</span> <span class="special">;</span>
-<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">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">unique_ptr</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&amp;&gt;</span> <span class="identifier">uinit2</span> <span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">uninit</span><span class="special">)</span> <span class="special">)</span> <span class="special">;</span>
-<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">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">v</span><span class="special">(</span><span class="keyword">new</span> <span class="identifier">T</span><span class="special">(</span><span class="number">2</span><span class="special">))</span> <span class="special">;</span>
-<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">unique_ptr</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&amp;&gt;</span> <span class="identifier">init</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span>
-<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">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">unique_ptr</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&amp;&gt;</span> <span class="identifier">init2</span> <span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">init</span><span class="special">)</span> <span class="special">)</span> <span class="special">;</span>
-<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>
- <span class="inlinemediaobject"><img src="../../images/space.png" alt="space"></span>
- </p>
-<a name="reference_optional_constructor_other_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;</span> <span class="keyword">explicit</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
- <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">optional</span><span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rhs</span> <span class="special">);</span></code>
- </p></blockquote></div>
-<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
-<li class="listitem">
- <span class="bold"><strong>Effect:</strong></span> Copy-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 a <span class="emphasis"><em>copy</em></span> of the value
- of rhs converted to type <code class="computeroutput"><span class="identifier">T</span></code>;
- else <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
- is 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="keyword">const</span><span class="special">&amp;</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="keyword">const</span><span class="special">&amp;</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="keyword">const</span><span class="special">&amp;</span> <span class="special">);</span></code>
- in that case, this constructor has no effect.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Example:</strong></span>
-<pre class="programlisting"><span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&gt;</span> <span class="identifier">x</span><span class="special">(</span><span class="number">123.4</span><span class="special">);</span>
-<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">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">y</span><span class="special">(</span><span class="identifier">x</span><span class="special">)</span> <span class="special">;</span>
-<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>
- <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">&lt;</span><span class="identifier">U</span><span class="special">&gt;</span> <span class="keyword">explicit</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
- <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">optional</span><span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;&amp;&amp;</span>
- <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">&amp;&amp;</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">&amp;&amp;</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">&amp;&amp;</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">&amp;&amp;</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">&lt;</span><span class="keyword">double</span><span class="special">&gt;</span> <span class="identifier">x</span><span class="special">(</span><span class="number">123.4</span><span class="special">);</span>
-<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">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">y</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">x</span><span class="special">))</span> <span class="special">;</span>
-<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>
- <span class="inlinemediaobject"><img src="../../images/space.png" alt="space"></span>
- </p>
-<a name="reference_optional_constructor_factory"></a><div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="identifier">InPlaceFactory</span><span class="special">&gt;</span>
- <span class="keyword">explicit</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
- <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">optional</span><span class="special">(</span> <span class="identifier">InPlaceFactory</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">f</span> <span class="special">);</span></code>
- </p></blockquote></div>
-<div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="identifier">TypedInPlaceFactory</span><span class="special">&gt;</span>
- <span class="keyword">explicit</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
- <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">optional</span><span class="special">(</span> <span class="identifier">TypedInPlaceFactory</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">f</span> <span class="special">);</span></code>
- </p></blockquote></div>
-<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
-<li class="listitem">
- <span class="bold"><strong>Effect:</strong></span> Constructs an <code class="computeroutput"><span class="identifier">optional</span></code> with a value of <code class="computeroutput"><span class="identifier">T</span></code> obtained from the factory.
- </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 <span class="emphasis"><em>directly given</em></span> from the factory
- <code class="computeroutput"><span class="identifier">f</span></code> (i.e., the value <span class="underline">is not copied</span>).
- </li>
-<li class="listitem">
- <span class="bold"><strong>Throws:</strong></span> Whatever the <code class="computeroutput"><span class="identifier">T</span></code>
- constructor called by the factory throws.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Notes:</strong></span> See <a class="link" href="../tutorial/in_place_factories.html" title="In-Place Factories">In-Place
- Factories</a>
- </li>
-<li class="listitem">
- <span class="bold"><strong>Exception Safety:</strong></span> Exceptions can only
- be thrown during the call to the <code class="computeroutput"><span class="identifier">T</span></code>
- constructor used by the factory; in that case, this constructor has no
- effect.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Example:</strong></span>
-<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">C</span> <span class="special">{</span> <span class="identifier">C</span> <span class="special">(</span> <span class="keyword">char</span><span class="special">,</span> <span class="keyword">double</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="special">)</span> <span class="special">;</span> <span class="special">}</span> <span class="special">;</span>
-
-<span class="identifier">C</span> <span class="identifier">v</span><span class="special">(</span><span class="char">'A'</span><span class="special">,</span><span class="number">123.4</span><span class="special">,</span><span class="string">"hello"</span><span class="special">);</span>
-
-<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">C</span><span class="special">&gt;</span> <span class="identifier">x</span><span class="special">(</span> <span class="identifier">in_place</span> <span class="special">(</span><span class="char">'A'</span><span class="special">,</span> <span class="number">123.4</span><span class="special">,</span> <span class="string">"hello"</span><span class="special">)</span> <span class="special">);</span> <span class="comment">// InPlaceFactory used</span>
-<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">C</span><span class="special">&gt;</span> <span class="identifier">y</span><span class="special">(</span> <span class="identifier">in_place</span><span class="special">&lt;</span><span class="identifier">C</span><span class="special">&gt;(</span><span class="char">'A'</span><span class="special">,</span> <span class="number">123.4</span><span class="special">,</span> <span class="string">"hello"</span><span class="special">)</span> <span class="special">);</span> <span class="comment">// TypedInPlaceFactory used</span>
-
-<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">x</span> <span class="special">==</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span>
-<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">y</span> <span class="special">==</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span>
-</pre>
- </li>
-</ul></div>
-<p>
- <span class="inlinemediaobject"><img src="../../images/space.png" alt="space"></span>
- </p>
-<a name="reference_optional_operator_equal_none_t"></a><div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="identifier">optional</span><span class="special">&amp;</span>
- <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">none_t</span> <span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span></code>
- </p></blockquote></div>
-<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
-<li class="listitem">
- <span class="bold"><strong>Effect:</strong></span> If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is initialized destroys its contained
- value.
- </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 uninitialized.
- </li>
-</ul></div>
-<p>
- <span class="inlinemediaobject"><img src="../../images/space.png" alt="space"></span>
- </p>
-<a name="reference_optional_operator_equal_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="identifier">optional</span><span class="special">&amp;</span>
- <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">T</span>
- <span class="keyword">const</span><span class="special">&amp;</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> Assigns 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 a
- <span class="emphasis"><em>copy</em></span> of <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="keyword">const</span><span class="special">&amp;</span> <span class="special">)</span></code> or <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;)</span></code>
- throws.
- </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
- assignment operator is used, otherwise, its copy-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>copy 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">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">def</span> <span class="special">;</span>
-<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="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">y</span><span class="special">;</span>
-<span class="identifier">def</span> <span class="special">=</span> <span class="identifier">y</span> <span class="special">;</span>
-<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">def</span> <span class="special">==</span> <span class="identifier">y</span> <span class="special">)</span> <span class="special">;</span>
-<span class="identifier">opt</span> <span class="special">=</span> <span class="identifier">y</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">y</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">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;&amp;</span>
- <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">T</span><span class="special">&amp;</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> (Re)binds the wrapped reference.
- </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 it references
- the same object referenced by <code class="computeroutput"><span class="identifier">rhs</span></code>.
- </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, it is <span class="emphasis"><em>rebound</em></span>
- to the new object. See <a class="link" href="../tutorial/rebinding_semantics_for_assignment_of_optional_references.html" title="Rebinding semantics for assignment of optional references">here</a>
- for details on this behavior.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Example:</strong></span>
-<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">a</span> <span class="special">=</span> <span class="number">1</span> <span class="special">;</span>
-<span class="keyword">int</span> <span class="identifier">b</span> <span class="special">=</span> <span class="number">2</span> <span class="special">;</span>
-<span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">ra</span> <span class="special">=</span> <span class="identifier">a</span> <span class="special">;</span>
-<span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">rb</span> <span class="special">=</span> <span class="identifier">b</span> <span class="special">;</span>
-<span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&amp;&gt;</span> <span class="identifier">def</span> <span class="special">;</span>
-<span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&amp;&gt;</span> <span class="identifier">opt</span><span class="special">(</span><span class="identifier">ra</span><span class="special">)</span> <span class="special">;</span>
-
-<span class="identifier">def</span> <span class="special">=</span> <span class="identifier">rb</span> <span class="special">;</span> <span class="comment">// binds 'def' to 'b' through 'rb'</span>
-<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">def</span> <span class="special">==</span> <span class="identifier">b</span> <span class="special">)</span> <span class="special">;</span>
-<span class="special">*</span><span class="identifier">def</span> <span class="special">=</span> <span class="identifier">a</span> <span class="special">;</span> <span class="comment">// changes the value of 'b' to a copy of the value of 'a'</span>
-<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">b</span> <span class="special">==</span> <span class="identifier">a</span> <span class="special">)</span> <span class="special">;</span>
-<span class="keyword">int</span> <span class="identifier">c</span> <span class="special">=</span> <span class="number">3</span><span class="special">;</span>
-<span class="keyword">int</span><span class="special">&amp;</span> <span class="identifier">rc</span> <span class="special">=</span> <span class="identifier">c</span> <span class="special">;</span>
-<span class="identifier">opt</span> <span class="special">=</span> <span class="identifier">rc</span> <span class="special">;</span> <span class="comment">// REBINDS to 'c' through 'rc'</span>
-<span class="identifier">c</span> <span class="special">=</span> <span class="number">4</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="number">4</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>
-<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">&amp;</span>
- <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">T</span><span class="special">&amp;&amp;</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">&amp;&amp;</span> <span class="special">)</span></code>
- or <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span><span class="identifier">T</span> <span class="special">&amp;&amp;)</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">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">def</span> <span class="special">;</span>
-<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="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">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;&amp;</span>
- <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">T</span><span class="special">&amp;&amp;</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>
- <span class="inlinemediaobject"><img src="../../images/space.png" alt="space"></span>
- </p>
-<a name="reference_optional_operator_equal_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="identifier">optional</span><span class="special">&amp;</span>
- <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">optional</span>
- <span class="keyword">const</span><span class="special">&amp;</span>
- <span class="identifier">rhs</span> <span class="special">)</span>
- <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">T</span></code>
- is <a href="../../../../../utility/CopyConstructible.html" target="_top"><code class="computeroutput"><span class="identifier">CopyConstructible</span></code></a> and <code class="computeroutput"><span class="identifier">CopyAssignable</span></code>.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Effects:</strong></span>
- <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: circle; ">
-<li class="listitem">
- If <code class="computeroutput"><span class="special">!*</span><span class="keyword">this</span>
- <span class="special">&amp;&amp;</span> <span class="special">!</span><span class="identifier">rhs</span></code> no effect, otherwise
- </li>
-<li class="listitem">
- if <code class="computeroutput"><span class="keyword">bool</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span>
- <span class="special">&amp;&amp;</span> <span class="special">!</span><span class="identifier">rhs</span></code>, destroys the contained value
- by calling <code class="computeroutput"><span class="identifier">val</span><span class="special">-&gt;</span><span class="identifier">T</span><span class="special">::~</span><span class="identifier">T</span><span class="special">()</span></code>, otherwise
- </li>
-<li class="listitem">
- if <code class="computeroutput"><span class="special">!*</span><span class="keyword">this</span>
- <span class="special">&amp;&amp;</span> <span class="keyword">bool</span><span class="special">(</span><span class="identifier">rhs</span><span class="special">)</span></code>, initializes the contained value
- as if direct-initializing an object of type <code class="computeroutput"><span class="identifier">T</span></code>
- with <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code>,
- otherwise
- </li>
-<li class="listitem">
- (if <code class="computeroutput"><span class="keyword">bool</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span>
- <span class="special">&amp;&amp;</span> <span class="keyword">bool</span><span class="special">(</span><span class="identifier">rhs</span><span class="special">)</span></code>) assigns <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code> to the contained value.
- </li>
-</ul></div>
- </li>
-<li class="listitem">
- <span class="bold"><strong>Returns:</strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>;
- </li>
-<li class="listitem">
- <span class="bold"><strong>Postconditions:</strong></span> <code class="computeroutput"><span class="keyword">bool</span><span class="special">(</span><span class="identifier">rhs</span><span class="special">)</span> <span class="special">==</span> <span class="keyword">bool</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span></code>.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Exception Safety:</strong></span> If any exception is
- thrown, the initialization state of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> and <code class="computeroutput"><span class="identifier">rhs</span></code>
- remains unchanged. If an exception is thrown during the call to <code class="computeroutput"><span class="identifier">T</span></code>'s copy constructor, no effect. If
- an exception is thrown during the call to <code class="computeroutput"><span class="identifier">T</span></code>'s
- copy assignment, the state of its contained value is as defined by the
- exception safety guarantee of <code class="computeroutput"><span class="identifier">T</span></code>'s
- copy assignment.
- </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">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">opt</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span>
-<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">def</span> <span class="special">;</span>
-
-<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="special">!</span><span class="identifier">def</span> <span class="special">)</span> <span class="special">;</span>
-<span class="comment">// previous value (copy of 'v') destroyed from within 'opt'.</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">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span>
- <span class="special">&amp;</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span> <span class="keyword">const</span><span class="special">&amp;</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> (Re)binds thee wrapped reference.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Postconditions:</strong></span> If <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code> is initialized, <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is initialized and it references
- the same object referenced by <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code>; otherwise, <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is uninitialized (and references
- no object).
- </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 and so is <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code>,
- <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
- is <span class="emphasis"><em>rebound</em></span> to the new object. See <a class="link" href="../tutorial/rebinding_semantics_for_assignment_of_optional_references.html" title="Rebinding semantics for assignment of optional references">here</a>
- for details on this behavior.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Example:</strong></span>
-<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">a</span> <span class="special">=</span> <span class="number">1</span> <span class="special">;</span>
-<span class="keyword">int</span> <span class="identifier">b</span> <span class="special">=</span> <span class="number">2</span> <span class="special">;</span>
-<span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">ra</span> <span class="special">=</span> <span class="identifier">a</span> <span class="special">;</span>
-<span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">rb</span> <span class="special">=</span> <span class="identifier">b</span> <span class="special">;</span>
-<span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&amp;&gt;</span> <span class="identifier">def</span> <span class="special">;</span>
-<span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&amp;&gt;</span> <span class="identifier">ora</span><span class="special">(</span><span class="identifier">ra</span><span class="special">)</span> <span class="special">;</span>
-<span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&amp;&gt;</span> <span class="identifier">orb</span><span class="special">(</span><span class="identifier">rb</span><span class="special">)</span> <span class="special">;</span>
-
-<span class="identifier">def</span> <span class="special">=</span> <span class="identifier">orb</span> <span class="special">;</span> <span class="comment">// binds 'def' to 'b' through 'rb' wrapped within 'orb'</span>
-<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">def</span> <span class="special">==</span> <span class="identifier">b</span> <span class="special">)</span> <span class="special">;</span>
-<span class="special">*</span><span class="identifier">def</span> <span class="special">=</span> <span class="identifier">ora</span> <span class="special">;</span> <span class="comment">// changes the value of 'b' to a copy of the value of 'a'</span>
-<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">b</span> <span class="special">==</span> <span class="identifier">a</span> <span class="special">)</span> <span class="special">;</span>
-<span class="keyword">int</span> <span class="identifier">c</span> <span class="special">=</span> <span class="number">3</span><span class="special">;</span>
-<span class="keyword">int</span><span class="special">&amp;</span> <span class="identifier">rc</span> <span class="special">=</span> <span class="identifier">c</span> <span class="special">;</span>
-<span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&amp;&gt;</span> <span class="identifier">orc</span><span class="special">(</span><span class="identifier">rc</span><span class="special">)</span> <span class="special">;</span>
-<span class="identifier">ora</span> <span class="special">=</span> <span class="identifier">orc</span> <span class="special">;</span> <span class="comment">// REBINDS ora to 'c' through 'rc'</span>
-<span class="identifier">c</span> <span class="special">=</span> <span class="number">4</span> <span class="special">;</span>
-<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">ora</span> <span class="special">==</span> <span class="number">4</span> <span class="special">)</span> <span class="special">;</span>
-</pre>
- </li>
-</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">&amp;</span>
- <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&amp;&amp;</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">T</span></code>
- is <code class="computeroutput"><span class="identifier">MoveConstructible</span></code>
- and <code class="computeroutput"><span class="identifier">MoveAssignable</span></code>.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Effects:</strong></span>
- <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: circle; ">
-<li class="listitem">
- If <code class="computeroutput"><span class="special">!*</span><span class="keyword">this</span>
- <span class="special">&amp;&amp;</span> <span class="special">!</span><span class="identifier">rhs</span></code> no effect, otherwise
- </li>
-<li class="listitem">
- if <code class="computeroutput"><span class="keyword">bool</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span>
- <span class="special">&amp;&amp;</span> <span class="special">!</span><span class="identifier">rhs</span></code>, destroys the contained value
- by calling <code class="computeroutput"><span class="identifier">val</span><span class="special">-&gt;</span><span class="identifier">T</span><span class="special">::~</span><span class="identifier">T</span><span class="special">()</span></code>, otherwise
- </li>
-<li class="listitem">
- if <code class="computeroutput"><span class="special">!*</span><span class="keyword">this</span>
- <span class="special">&amp;&amp;</span> <span class="keyword">bool</span><span class="special">(</span><span class="identifier">rhs</span><span class="special">)</span></code>, initializes the contained value
- as if direct-initializing an object of type <code class="computeroutput"><span class="identifier">T</span></code>
- with <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(*</span><span class="identifier">rhs</span><span class="special">)</span></code>,
- otherwise
- </li>
-<li class="listitem">
- (if <code class="computeroutput"><span class="keyword">bool</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span>
- <span class="special">&amp;&amp;</span> <span class="keyword">bool</span><span class="special">(</span><span class="identifier">rhs</span><span class="special">)</span></code>) assigns <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(*</span><span class="identifier">rhs</span><span class="special">)</span></code> to the contained value.
- </li>
-</ul></div>
- </li>
-<li class="listitem">
- <span class="bold"><strong>Returns:</strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>;
- </li>
-<li class="listitem">
- <span class="bold"><strong>Postconditions:</strong></span> <code class="computeroutput"><span class="keyword">bool</span><span class="special">(</span><span class="identifier">rhs</span><span class="special">)</span> <span class="special">==</span> <span class="keyword">bool</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span></code>.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Remarks:</strong></span> 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">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span> <span class="special">&amp;&amp;</span>
- <span class="identifier">is_nothrow_move_assignable</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span></code>.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Exception Safety:</strong></span> If any exception is
- thrown, the initialization state of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> and <code class="computeroutput"><span class="identifier">rhs</span></code>
- remains unchanged. If an exception is thrown during the call to <code class="computeroutput"><span class="identifier">T</span></code>'s move constructor, the state of
- <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code>
- is determined by the exception safety guarantee of <code class="computeroutput"><span class="identifier">T</span></code>'s
- move constructor. If an exception is thrown during the call to T's move-assignment,
- the state of <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>
- is determined by the exception safety guarantee of T's move assignment.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Example:</strong></span>
-<pre class="programlisting"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">opt</span><span class="special">(</span><span class="identifier">T</span><span class="special">(</span><span class="number">2</span><span class="special">))</span> <span class="special">;</span>
-<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">def</span> <span class="special">;</span>
-
-<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">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span>
- <span class="special">&amp;</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;&amp;&amp;</span> <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">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rhs</span>
- <span class="special">)</span></code>.
- </li></ul></div>
-<p>
- <span class="inlinemediaobject"><img src="../../images/space.png" alt="space"></span>
- </p>
-<a name="reference_optional_operator_equal_other_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;</span> <span class="identifier">optional</span><span class="special">&amp;</span>
- <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</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> 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 a <span class="emphasis"><em>copy</em></span> of the value
- of <code class="computeroutput"><span class="identifier">rhs</span></code> <span class="emphasis"><em>converted</em></span>
- to type <code class="computeroutput"><span class="identifier">T</span></code>; else <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
- is 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="keyword">const</span><span class="special">&amp;</span> <span class="special">)</span></code> or <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span> <span class="identifier">U</span> <span class="keyword">const</span><span class="special">&amp;</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 rhs 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></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 rhs
- 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></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">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">opt0</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span>
-<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;</span> <span class="identifier">opt1</span><span class="special">;</span>
-
-<span class="identifier">opt1</span> <span class="special">=</span> <span class="identifier">opt0</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">&lt;</span><span class="identifier">U</span><span class="special">&gt;(</span><span class="identifier">v</span><span class="special">)</span> <span class="special">)</span> <span class="special">;</span>
-</pre>
- </li>
-</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">&lt;</span><span class="identifier">U</span><span class="special">&gt;</span> <span class="identifier">optional</span><span class="special">&amp;</span>
- <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;&amp;&amp;</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">&amp;&amp;</span> <span class="special">)</span></code>
- or <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span> <span class="identifier">U</span><span class="special">&amp;&amp;</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">&amp;&amp;</span></code>) is used. If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
- is initially initialized but <code class="computeroutput"><span class="identifier">rhs</span></code>
- is uninitialized, <code class="computeroutput"><span class="identifier">T</span></code>'s
- <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">&amp;&amp;</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">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">opt0</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span>
-<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;</span> <span class="identifier">opt1</span><span class="special">;</span>
-
-<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="identifier">opt0</span> <span class="special">);</span>
-<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">opt1</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">&lt;</span><span class="identifier">U</span><span class="special">&gt;(</span><span class="identifier">v</span><span class="special">)</span> <span class="special">)</span> <span class="special">;</span>
-</pre>
- </li>
-</ul></div>
-<p>
- <span class="inlinemediaobject"><img src="../../images/space.png" alt="space"></span>
- </p>
-<a name="reference_optional_emplace"></a><div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span><span class="special">...</span> <span class="identifier">Args</span><span class="special">&gt;</span> <span class="keyword">void</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
- <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">emplace</span><span class="special">(</span> <span class="identifier">Args</span><span class="special">...&amp;&amp;</span>
- <span class="identifier">args</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> The compiler supports rvalue
- references and variadic templates.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Effect:</strong></span> If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is initialized calls <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span> <span class="special">=</span> <span class="identifier">none</span></code>.
- Then initializes in-place the contained value as if direct-initializing
- an object of type <code class="computeroutput"><span class="identifier">T</span></code> with
- <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">Args</span><span class="special">&gt;(</span><span class="identifier">args</span><span class="special">)...</span></code>.
- </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>.
- </li>
-<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.
- </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">
- <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>,
- <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
- is <span class="emphasis"><em>uninitialized</em></span>.
- </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">&lt;</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">opt</span><span class="special">;</span>
-<span class="identifier">opt</span><span class="special">.</span><span class="identifier">emplace</span><span class="special">(</span><span class="number">0</span><span class="special">);</span> <span class="comment">// create in-place using ctor T(int)</span>
-<span class="identifier">opt</span><span class="special">.</span><span class="identifier">emplace</span><span class="special">();</span> <span class="comment">// destroy previous and default-construct another T</span>
-<span class="identifier">opt</span><span class="special">.</span><span class="identifier">emplace</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span> <span class="comment">// destroy and copy-construct in-place (no assignment called)</span>
-</pre>
- </li>
-</ul></div>
-<p>
- <span class="inlinemediaobject"><img src="../../images/space.png" alt="space"></span>
- </p>
-<a name="reference_optional_operator_equal_factory"></a><div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="identifier">InPlaceFactory</span><span class="special">&gt;</span>
- <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&amp;</span>
- <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">InPlaceFactory</span>
- <span class="keyword">const</span><span class="special">&amp;</span>
- <span class="identifier">f</span> <span class="special">);</span></code>
- </p></blockquote></div>
-<div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="identifier">TypedInPlaceFactory</span><span class="special">&gt;</span>
- <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&amp;</span>
- <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">TypedInPlaceFactory</span>
- <span class="keyword">const</span><span class="special">&amp;</span>
- <span class="identifier">f</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> Assigns an <code class="computeroutput"><span class="identifier">optional</span></code>
- with a value of <code class="computeroutput"><span class="identifier">T</span></code> obtained
- from the factory.
- </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 <span class="emphasis"><em>directly given</em></span> from the factory
- <code class="computeroutput"><span class="identifier">f</span></code> (i.e., the value <span class="underline">is not copied</span>).
- </li>
-<li class="listitem">
- <span class="bold"><strong>Throws:</strong></span> Whatever the <code class="computeroutput"><span class="identifier">T</span></code>
- constructor called by the factory throws.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Notes:</strong></span> See <a class="link" href="../tutorial/in_place_factories.html" title="In-Place Factories">In-Place
- Factories</a>
- </li>
-<li class="listitem">
- <span class="bold"><strong>Exception Safety:</strong></span> Exceptions can only
- be thrown during the call to the <code class="computeroutput"><span class="identifier">T</span></code>
- constructor used by the factory; in that case, the <code class="computeroutput"><span class="identifier">optional</span></code>
- object will be reset to be <span class="emphasis"><em>uninitialized</em></span>.
- </li>
-</ul></div>
-<p>
- <span class="inlinemediaobject"><img src="../../images/space.png" alt="space"></span>
- </p>
-<a name="reference_optional_reset_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="keyword">void</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
- <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">reset</span><span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span></code>
- </p></blockquote></div>
-<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
- <span class="bold"><strong>Deprecated:</strong></span> same as <code class="computeroutput"><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">T</span>
- <span class="keyword">const</span><span class="special">&amp;</span>
- <span class="identifier">v</span><span class="special">)</span>
- <span class="special">;</span></code>
- </li></ul></div>
-<p>
- <span class="inlinemediaobject"><img src="../../images/space.png" alt="space"></span>
- </p>
-<a name="reference_optional_reset"></a><div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="keyword">void</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">reset</span><span class="special">()</span> <span class="keyword">noexcept</span> <span class="special">;</span></code>
- </p></blockquote></div>
-<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
- <span class="bold"><strong>Deprecated:</strong></span> Same as <code class="computeroutput"><span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">none_t</span>
- <span class="special">);</span></code>
- </li></ul></div>
-<p>
- <span class="inlinemediaobject"><img src="../../images/space.png" alt="space"></span>
- </p>
-<a name="reference_optional_get"></a><div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
- <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">get</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">;</span></code>
- </p></blockquote></div>
-<div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="identifier">T</span><span class="special">&amp;</span>
- <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">get</span><span class="special">()</span> <span class="special">;</span></code>
- </p></blockquote></div>
-<div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="keyword">inline</span> <span class="identifier">T</span>
- <span class="keyword">const</span><span class="special">&amp;</span>
- <span class="identifier">get</span> <span class="special">(</span>
- <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">)</span> <span class="special">;</span></code>
- </p></blockquote></div>
-<div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="keyword">inline</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">get</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
- <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;</span>
- <span class="special">&amp;)</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="special">*</span><span class="keyword">this</span></code> is initialized
- </li>
-<li class="listitem">
- <span class="bold"><strong>Returns:</strong></span> A reference to the contained
- value
- </li>
-<li class="listitem">
- <span class="bold"><strong>Throws:</strong></span> Nothing.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Notes:</strong></span> The requirement is asserted via
- <code class="computeroutput"><span class="identifier">BOOST_ASSERT</span><span class="special">()</span></code>.
- </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">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;::</span><span class="identifier">get</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">;</span></code>
- </p></blockquote></div>
-<div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="identifier">T</span><span class="special">&amp;</span>
- <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;::</span><span class="identifier">get</span><span class="special">()</span> <span class="special">;</span></code>
- </p></blockquote></div>
-<div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="keyword">inline</span> <span class="identifier">T</span>
- <span class="keyword">const</span><span class="special">&amp;</span>
- <span class="identifier">get</span> <span class="special">(</span>
- <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span>
- <span class="keyword">const</span><span class="special">&amp;</span>
- <span class="special">)</span> <span class="special">;</span></code>
- </p></blockquote></div>
-<div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="keyword">inline</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">get</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span> <span class="special">&amp;)</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="special">*</span><span class="keyword">this</span></code> is initialized
- </li>
-<li class="listitem">
- <span class="bold"><strong>Returns:</strong></span> <span class="underline">The</span>
- reference contained.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Throws:</strong></span> Nothing.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Notes:</strong></span> The requirement is asserted via
- <code class="computeroutput"><span class="identifier">BOOST_ASSERT</span><span class="special">()</span></code>.
- </li>
-</ul></div>
-<p>
- <span class="inlinemediaobject"><img src="../../images/space.png" alt="space"></span>
- </p>
-<a name="reference_optional_operator_asterisk"></a><div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
- <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">*()</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">;</span></code>
- </p></blockquote></div>
-<div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="identifier">T</span><span class="special">&amp;</span>
- <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">*()</span> <span class="special">&amp;;</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="special">*</span><span class="keyword">this</span></code> is initialized
- </li>
-<li class="listitem">
- <span class="bold"><strong>Returns:</strong></span> A reference to the contained
- value
- </li>
-<li class="listitem">
- <span class="bold"><strong>Throws:</strong></span> Nothing.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Notes:</strong></span> The requirement is asserted via
- <code class="computeroutput"><span class="identifier">BOOST_ASSERT</span><span class="special">()</span></code>.
- On compilers that do not support ref-qualifiers on member functions these
- two overloads are replaced with the classical two: a <code class="computeroutput"><span class="keyword">const</span></code>
- and non-<code class="computeroutput"><span class="keyword">const</span></code> member functions.
- </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">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">opt</span> <span class="special">(</span> <span class="identifier">v</span> <span class="special">);</span>
-<span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">u</span> <span class="special">=</span> <span class="special">*</span><span class="identifier">opt</span><span class="special">;</span>
-<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">u</span> <span class="special">==</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span>
-<span class="identifier">T</span> <span class="identifier">w</span> <span class="special">;</span>
-<span class="special">*</span><span class="identifier">opt</span> <span class="special">=</span> <span class="identifier">w</span> <span class="special">;</span>
-<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">opt</span> <span class="special">==</span> <span class="identifier">w</span> <span class="special">)</span> <span class="special">;</span>
-</pre>
- </li>
-</ul></div>
-<p>
- <span class="inlinemediaobject"><img src="../../images/space.png" alt="space"></span>
- </p>
-<a name="reference_optional_operator_asterisk_move"></a><div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="identifier">T</span><span class="special">&amp;&amp;</span>
- <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">*()</span> <span class="special">&amp;&amp;;</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="special">*</span><span class="keyword">this</span></code> contains a value.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Effects:</strong></span> Equivalent to <code class="computeroutput"><span class="keyword">return</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(*</span><span class="identifier">val</span><span class="special">);</span></code>.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Notes:</strong></span> The requirement is asserted via
- <code class="computeroutput"><span class="identifier">BOOST_ASSERT</span><span class="special">()</span></code>.
- On compilers that do not support ref-qualifiers on member functions this
- overload is not present.
- </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">T</span> <span class="special">&amp;</span>
- <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;::</span><span class="keyword">operator</span><span class="special">*()</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">;</span></code>
- </p></blockquote></div>
-<div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="identifier">T</span> <span class="special">&amp;</span>
- <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;::</span><span class="keyword">operator</span><span class="special">*()</span> <span class="special">&amp;</span> <span class="special">;</span></code>
- </p></blockquote></div>
-<div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="identifier">T</span> <span class="special">&amp;</span>
- <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;::</span><span class="keyword">operator</span><span class="special">*()</span> <span class="special">&amp;&amp;</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="special">*</span><span class="keyword">this</span></code> is initialized
- </li>
-<li class="listitem">
- <span class="bold"><strong>Returns:</strong></span> <span class="underline">The</span>
- reference contained.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Throws:</strong></span> Nothing.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Notes:</strong></span> The requirement is asserted via
- <code class="computeroutput"><span class="identifier">BOOST_ASSERT</span><span class="special">()</span></code>.
- On compilers that do not support ref-qualifiers on member functions these
- three overloads are replaced with the classical two: a <code class="computeroutput"><span class="keyword">const</span></code> and non-<code class="computeroutput"><span class="keyword">const</span></code>
- member functions.
- </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">T</span><span class="special">&amp;</span> <span class="identifier">vref</span> <span class="special">=</span> <span class="identifier">v</span> <span class="special">;</span>
-<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span> <span class="identifier">opt</span> <span class="special">(</span> <span class="identifier">vref</span> <span class="special">);</span>
-<span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">vref2</span> <span class="special">=</span> <span class="special">*</span><span class="identifier">opt</span><span class="special">;</span>
-<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">vref2</span> <span class="special">==</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span>
-<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">opt</span> <span class="special">==</span> <span class="identifier">v</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>
-<a name="reference_optional_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">()</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">;</span></code>
- </p></blockquote></div>
-<div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="identifier">T</span><span class="special">&amp;</span>
- <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">()</span> <span class="special">&amp;</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>Effects:</strong></span> Equivalent to <code class="computeroutput"><span class="keyword">return</span> <span class="keyword">bool</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span> <span class="special">?</span> <span class="special">*</span><span class="identifier">val</span> <span class="special">:</span> <span class="keyword">throw</span> <span class="identifier">bad_optional_access</span><span class="special">();</span></code>.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Notes:</strong></span> On compilers that do not support
- ref-qualifiers on member functions these two overloads are replaced with
- the classical two: a <code class="computeroutput"><span class="keyword">const</span></code>
- and non-<code class="computeroutput"><span class="keyword">const</span></code> member functions.
- </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">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">o0</span><span class="special">,</span> <span class="identifier">o1</span> <span class="special">(</span> <span class="identifier">v</span> <span class="special">);</span>
-<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">o1</span><span class="special">.</span><span class="identifier">value</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">v</span> <span class="special">);</span>
-
-<span class="keyword">try</span> <span class="special">{</span>
- <span class="identifier">o0</span><span class="special">.</span><span class="identifier">value</span><span class="special">();</span> <span class="comment">// throws</span>
- <span class="identifier">assert</span> <span class="special">(</span> <span class="keyword">false</span> <span class="special">);</span>
-<span class="special">}</span>
-<span class="keyword">catch</span><span class="special">(</span><span class="identifier">bad_optional_access</span><span class="special">&amp;)</span> <span class="special">{</span>
- <span class="identifier">assert</span> <span class="special">(</span> <span class="keyword">true</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>
-<a name="reference_optional_value_move"></a><div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="identifier">T</span><span class="special">&amp;&amp;</span>
- <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">()</span> <span class="special">&amp;&amp;</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>Effects:</strong></span> Equivalent to <code class="computeroutput"><span class="keyword">return</span> <span class="keyword">bool</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</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">val</span><span class="special">)</span> <span class="special">:</span> <span class="keyword">throw</span>
- <span class="identifier">bad_optional_access</span><span class="special">();</span></code>.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Notes:</strong></span> On compilers that do not support
- ref-qualifiers on member functions this overload is not present.
- </li>
-</ul></div>
-<p>
- <span class="inlinemediaobject"><img src="../../images/space.png" alt="space"></span>
- </p>
-<a name="reference_optional_value_or"></a><div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">&gt;</span> <span class="identifier">T</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value_or</span><span class="special">(</span><span class="identifier">U</span> <span class="special">&amp;&amp;</span>
- <span class="identifier">v</span><span class="special">)</span>
- <span class="keyword">const</span><span class="special">&amp;</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>Effects:</strong></span> Equivalent to <code class="computeroutput"><span class="keyword">if</span> <span class="special">(*</span><span class="keyword">this</span><span class="special">)</span> <span class="keyword">return</span> <span class="special">**</span><span class="keyword">this</span><span class="special">;</span> <span class="keyword">else</span> <span class="keyword">return</span>
- <span class="identifier">std</span><span class="special">::</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;(</span><span class="identifier">v</span><span class="special">);</span></code>.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Remarks:</strong></span> If <code class="computeroutput"><span class="identifier">T</span></code>
- is not <a href="../../../../../utility/CopyConstructible.html" target="_top"><code class="computeroutput"><span class="identifier">CopyConstructible</span></code></a> or <code class="computeroutput"><span class="identifier">U</span> <span class="special">&amp;&amp;</span></code>
- is not convertible to <code class="computeroutput"><span class="identifier">T</span></code>,
- the program is ill-formed.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Notes:</strong></span> On compilers that do not support
- ref-qualifiers on member functions this overload is replaced with the
- <code class="computeroutput"><span class="keyword">const</span></code>-qualified member function.
- On compilers without rvalue reference support the type of <code class="computeroutput"><span class="identifier">v</span></code> becomes <code class="computeroutput"><span class="identifier">U</span>
- <span class="keyword">const</span><span class="special">&amp;</span></code>.
- </li>
-</ul></div>
-<p>
- <span class="inlinemediaobject"><img src="../../images/space.png" alt="space"></span>
- </p>
-<a name="reference_optional_value_or_move"></a><div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">&gt;</span> <span class="identifier">T</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value_or</span><span class="special">(</span><span class="identifier">U</span> <span class="special">&amp;&amp;</span>
- <span class="identifier">v</span><span class="special">)</span>
- <span class="special">&amp;&amp;</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>Effects:</strong></span> Equivalent to <code class="computeroutput"><span class="keyword">if</span> <span class="special">(*</span><span class="keyword">this</span><span class="special">)</span> <span class="keyword">return</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(**</span><span class="keyword">this</span><span class="special">);</span> <span class="keyword">else</span> <span class="keyword">return</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;(</span><span class="identifier">v</span><span class="special">);</span></code>.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Remarks:</strong></span> If <code class="computeroutput"><span class="identifier">T</span></code>
- is not <code class="computeroutput"><span class="identifier">MoveConstructible</span></code>
- or <code class="computeroutput"><span class="identifier">U</span> <span class="special">&amp;&amp;</span></code>
- is not convertible to <code class="computeroutput"><span class="identifier">T</span></code>,
- the program is ill-formed.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Notes:</strong></span> On compilers that do not support
- ref-qualifiers on member functions this overload is not present.
- </li>
-</ul></div>
-<p>
- <span class="inlinemediaobject"><img src="../../images/space.png" alt="space"></span>
- </p>
-<a name="reference_optional_value_or_call"></a><div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">&gt;</span> <span class="identifier">T</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value_or_eval</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">)</span> <span class="keyword">const</span><span class="special">&amp;</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">T</span></code>
- is <a href="../../../../../utility/CopyConstructible.html" target="_top"><code class="computeroutput"><span class="identifier">CopyConstructible</span></code></a> and <code class="computeroutput"><span class="identifier">F</span></code> models a <a href="http://www.sgi.com/tech/stl/Generator.html" target="_top"><code class="computeroutput"><span class="identifier">Generator</span></code></a> whose result type
- is convertible to <code class="computeroutput"><span class="identifier">T</span></code>.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Effects:</strong></span> <code class="computeroutput"><span class="keyword">if</span>
- <span class="special">(*</span><span class="keyword">this</span><span class="special">)</span> <span class="keyword">return</span> <span class="special">**</span><span class="keyword">this</span><span class="special">;</span> <span class="keyword">else</span> <span class="keyword">return</span> <span class="identifier">f</span><span class="special">();</span></code>.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Notes:</strong></span> On compilers that do not support
- ref-qualifiers on member functions this overload is replaced with the
- <code class="computeroutput"><span class="keyword">const</span></code>-qualified member function.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Example:</strong></span>
-<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">complain_and_0</span><span class="special">()</span>
-<span class="special">{</span>
- <span class="identifier">clog</span> <span class="special">&lt;&lt;</span> <span class="string">"no value returned, using default"</span> <span class="special">&lt;&lt;</span> <span class="identifier">endl</span><span class="special">;</span>
- <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
-<span class="special">}</span>
-
-<span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">o1</span> <span class="special">=</span> <span class="number">1</span><span class="special">;</span>
-<span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">oN</span> <span class="special">=</span> <span class="identifier">none</span><span class="special">;</span>
-
-<span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">o1</span><span class="special">.</span><span class="identifier">value_or_eval</span><span class="special">(</span><span class="identifier">complain_and_0</span><span class="special">);</span> <span class="comment">// fun not called</span>
-<span class="identifier">assert</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="keyword">int</span> <span class="identifier">j</span> <span class="special">=</span> <span class="identifier">oN</span><span class="special">.</span><span class="identifier">value_or_eval</span><span class="special">(</span><span class="identifier">complain_and_0</span><span class="special">);</span> <span class="comment">// fun called</span>
-<span class="identifier">assert</span> <span class="special">(</span><span class="identifier">i</span> <span class="special">==</span> <span class="number">0</span><span class="special">);</span>
-</pre>
- </li>
-</ul></div>
-<p>
- <span class="inlinemediaobject"><img src="../../images/space.png" alt="space"></span>
- </p>
-<a name="reference_optional_value_or_call_move"></a><div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">&gt;</span> <span class="identifier">T</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value_or_eval</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">)</span> <span class="special">&amp;&amp;</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">T</span></code>
- is <code class="computeroutput"><span class="identifier">MoveConstructible</span></code>
- and <code class="computeroutput"><span class="identifier">F</span></code> models a <a href="http://www.sgi.com/tech/stl/Generator.html" target="_top"><code class="computeroutput"><span class="identifier">Generator</span></code></a>
- whose result type is convertible to <code class="computeroutput"><span class="identifier">T</span></code>.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Effects:</strong></span> <code class="computeroutput"><span class="keyword">if</span>
- <span class="special">(*</span><span class="keyword">this</span><span class="special">)</span> <span class="keyword">return</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(**</span><span class="keyword">this</span><span class="special">);</span> <span class="keyword">else</span> <span class="keyword">return</span>
- <span class="identifier">f</span><span class="special">();</span></code>.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Notes:</strong></span> On compilers that do not support
- ref-qualifiers on member functions this overload is not present.
- </li>
-</ul></div>
-<p>
- <span class="inlinemediaobject"><img src="../../images/space.png" alt="space"></span>
- </p>
-<a name="reference_optional_get_value_or_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
- <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">get_value_or</span><span class="special">(</span>
- <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="keyword">default</span><span class="special">)</span> <span class="keyword">const</span> <span class="special">;</span></code>
- </p></blockquote></div>
-<div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="identifier">T</span><span class="special">&amp;</span>
- <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">get_value_or</span><span class="special">(</span> <span class="identifier">T</span><span class="special">&amp;</span>
- <span class="keyword">default</span> <span class="special">)</span>
- <span class="special">;</span></code>
- </p></blockquote></div>
-<div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="keyword">inline</span> <span class="identifier">T</span>
- <span class="keyword">const</span><span class="special">&amp;</span>
- <span class="identifier">get_optional_value_or</span> <span class="special">(</span>
- <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">o</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="keyword">default</span> <span class="special">)</span> <span class="special">;</span></code>
- </p></blockquote></div>
-<div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="keyword">inline</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">get_optional_value_or</span>
- <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
- <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;&amp;</span>
- <span class="identifier">o</span><span class="special">,</span>
- <span class="identifier">T</span><span class="special">&amp;</span>
- <span class="keyword">default</span> <span class="special">)</span>
- <span class="special">;</span></code>
- </p></blockquote></div>
-<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
-<li class="listitem">
- <span class="bold"><strong>Deprecated:</strong></span> Use <code class="computeroutput"><span class="identifier">value_or</span><span class="special">()</span></code> instead.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Returns:</strong></span> A reference to the contained
- value, if any, or <code class="computeroutput"><span class="keyword">default</span></code>.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Throws:</strong></span> Nothing.
- </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">z</span> <span class="special">;</span>
-<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">def</span><span class="special">;</span>
-<span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">y</span> <span class="special">=</span> <span class="identifier">def</span><span class="special">.</span><span class="identifier">get_value_or</span><span class="special">(</span><span class="identifier">z</span><span class="special">);</span>
-<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">y</span> <span class="special">==</span> <span class="identifier">z</span> <span class="special">)</span> <span class="special">;</span>
-
-<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">opt</span> <span class="special">(</span> <span class="identifier">v</span> <span class="special">);</span>
-<span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">u</span> <span class="special">=</span> <span class="identifier">get_optional_value_or</span><span class="special">(</span><span class="identifier">opt</span><span class="special">,</span><span class="identifier">z</span><span class="special">);</span>
-<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">u</span> <span class="special">==</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span>
-<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">u</span> <span class="special">!=</span> <span class="identifier">z</span> <span class="special">)</span> <span class="special">;</span>
-</pre>
- </li>
-</ul></div>
-<p>
- <span class="inlinemediaobject"><img src="../../images/space.png" alt="space"></span>
- </p>
-<a name="reference_optional_get_ptr"></a><div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="identifier">T</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
- <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">get_ptr</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">;</span></code>
- </p></blockquote></div>
-<div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="identifier">T</span><span class="special">*</span>
- <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">get_ptr</span><span class="special">()</span> <span class="special">;</span></code>
- </p></blockquote></div>
-<div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="keyword">inline</span> <span class="identifier">T</span>
- <span class="keyword">const</span><span class="special">*</span>
- <span class="identifier">get_pointer</span> <span class="special">(</span>
- <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">)</span> <span class="special">;</span></code>
- </p></blockquote></div>
-<div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="keyword">inline</span> <span class="identifier">T</span><span class="special">*</span> <span class="identifier">get_pointer</span>
- <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
- <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;</span>
- <span class="special">&amp;)</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>Returns:</strong></span> If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is initialized, a pointer to the
- contained value; else <code class="computeroutput"><span class="number">0</span></code> (<span class="emphasis"><em>null</em></span>).
- </li>
-<li class="listitem">
- <span class="bold"><strong>Throws:</strong></span> Nothing.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Notes:</strong></span> The contained value is permanently
- stored within <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
- so you should not hold nor delete this pointer
- </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">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">opt</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span>
-<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span> <span class="identifier">copt</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span>
-<span class="identifier">T</span><span class="special">*</span> <span class="identifier">p</span> <span class="special">=</span> <span class="identifier">opt</span><span class="special">.</span><span class="identifier">get_ptr</span><span class="special">()</span> <span class="special">;</span>
-<span class="identifier">T</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">cp</span> <span class="special">=</span> <span class="identifier">copt</span><span class="special">.</span><span class="identifier">get_ptr</span><span class="special">();</span>
-<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">p</span> <span class="special">==</span> <span class="identifier">get_pointer</span><span class="special">(</span><span class="identifier">opt</span><span class="special">)</span> <span class="special">);</span>
-<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">cp</span> <span class="special">==</span> <span class="identifier">get_pointer</span><span class="special">(</span><span class="identifier">copt</span><span class="special">)</span> <span class="special">)</span> <span class="special">;</span>
-</pre>
- </li>
-</ul></div>
-<p>
- <span class="inlinemediaobject"><img src="../../images/space.png" alt="space"></span>
- </p>
-<a name="reference_optional_operator_arrow"></a><div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="identifier">T</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
- <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="keyword">operator</span> <span class="special">-&gt;()</span>
- <span class="keyword">const</span> <span class="special">;</span></code>
- </p></blockquote></div>
-<div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="identifier">T</span><span class="special">*</span>
- <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="keyword">operator</span>
- <span class="special">-&gt;()</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="special">*</span><span class="keyword">this</span></code> is initialized.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Returns:</strong></span> A pointer to the contained
- value.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Throws:</strong></span> Nothing.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Notes:</strong></span> The requirement is asserted via
- <code class="computeroutput"><span class="identifier">BOOST_ASSERT</span><span class="special">()</span></code>.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Example:</strong></span>
-<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">X</span> <span class="special">{</span> <span class="keyword">int</span> <span class="identifier">mdata</span> <span class="special">;</span> <span class="special">}</span> <span class="special">;</span>
-<span class="identifier">X</span> <span class="identifier">x</span> <span class="special">;</span>
-<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">X</span><span class="special">&gt;</span> <span class="identifier">opt</span> <span class="special">(</span><span class="identifier">x</span><span class="special">);</span>
-<span class="identifier">opt</span><span class="special">-&gt;</span><span class="identifier">mdata</span> <span class="special">=</span> <span class="number">2</span> <span class="special">;</span>
-</pre>
- </li>
-</ul></div>
-<p>
- <span class="inlinemediaobject"><img src="../../images/space.png" alt="space"></span>
- </p>
-<a name="reference_optional_operator_bool"></a><div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="keyword">explicit</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="keyword">operator</span>
- <span class="keyword">bool</span><span class="special">()</span>
- <span class="keyword">const</span> <span class="keyword">noexcept</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>Returns:</strong></span> <code class="computeroutput"><span class="identifier">get_ptr</span><span class="special">()</span> <span class="special">!=</span> <span class="number">0</span></code>.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Notes:</strong></span> On compilers that do not support
- explicit conversion operators this falls back to safe-bool idiom.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Example:</strong></span>
-<pre class="programlisting"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">def</span> <span class="special">;</span>
-<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">def</span> <span class="special">==</span> <span class="number">0</span> <span class="special">);</span>
-<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">opt</span> <span class="special">(</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span>
-<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">opt</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="number">0</span> <span class="special">);</span>
-</pre>
- </li>
-</ul></div>
-<p>
- <span class="inlinemediaobject"><img src="../../images/space.png" alt="space"></span>
- </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">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">!()</span> <span class="keyword">noexcept</span> <span class="special">;</span></code>
- </p></blockquote></div>
-<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
-<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>;
- else <code class="computeroutput"><span class="keyword">false</span></code>.
- </li>
-<li class="listitem">
- <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>
- in certain boolean contexts.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Example:</strong></span>
-<pre class="programlisting"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">opt</span> <span class="special">;</span>
-<span class="identifier">assert</span> <span class="special">(</span> <span class="special">!</span><span class="identifier">opt</span> <span class="special">);</span>
-<span class="special">*</span><span class="identifier">opt</span> <span class="special">=</span> <span class="identifier">some_T</span> <span class="special">;</span>
-
-<span class="comment">// Notice the "double-bang" idiom here.</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="special">;</span>
-</pre>
- </li>
-</ul></div>
-<p>
- <span class="inlinemediaobject"><img src="../../images/space.png" alt="space"></span>
- </p>
-<a name="reference_optional_is_initialized"></a><div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="keyword">bool</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">is_initialized</span><span class="special">()</span> <span class="keyword">const</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>Deprecated:</strong></span> Same as <code class="computeroutput"><span class="keyword">explicit</span>
- <span class="keyword">operator</span> <span class="keyword">bool</span>
- <span class="special">()</span> <span class="special">;</span></code>
- </li></ul></div>
-<p>
- <span class="inlinemediaobject"><img src="../../images/space.png" alt="space"></span>
- </p>
-<h5>
-<a name="boost_optional.reference.detailed_semantics.h1"></a>
- <span class="phrase"><a name="boost_optional.reference.detailed_semantics.free_functions"></a></span><a class="link" href="detailed_semantics.html#boost_optional.reference.detailed_semantics.free_functions">Free
- functions</a>
- </h5>
-<p>
- <span class="inlinemediaobject"><img src="../../images/space.png" alt="space"></span>
- </p>
-<a name="reference_make_optional_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;</span> <span class="identifier">make_optional</span><span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">v</span> <span class="special">)</span></code>
- </p></blockquote></div>
-<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
-<li class="listitem">
- <span class="bold"><strong>Returns: </strong></span> <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;(</span><span class="identifier">v</span><span class="special">)</span></code> for the <span class="emphasis"><em>deduced</em></span>
- type <code class="computeroutput"><span class="identifier">T</span></code> of <code class="computeroutput"><span class="identifier">v</span></code>.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Example:</strong></span>
-<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">void</span> <span class="identifier">foo</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">opt</span> <span class="special">)</span> <span class="special">;</span>
-
-<span class="identifier">foo</span> <span class="special">(</span> <span class="identifier">make_optional</span><span class="special">(</span><span class="number">1</span><span class="special">+</span><span class="number">1</span><span class="special">)</span> <span class="special">)</span> <span class="special">;</span> <span class="comment">// Creates an optional&lt;int&gt;</span>
-</pre>
- </li>
-</ul></div>
-<p>
- <span class="inlinemediaobject"><img src="../../images/space.png" alt="space"></span>
- </p>
-<a name="reference_make_optional_bool_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;</span> <span class="identifier">make_optional</span><span class="special">(</span> <span class="keyword">bool</span> <span class="identifier">condition</span><span class="special">,</span>
- <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">v</span> <span class="special">)</span></code>
- </p></blockquote></div>
-<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
-<li class="listitem">
- <span class="bold"><strong>Returns: </strong></span> <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;(</span><span class="identifier">condition</span><span class="special">,</span><span class="identifier">v</span><span class="special">)</span></code> for the <span class="emphasis"><em>deduced</em></span>
- type <code class="computeroutput"><span class="identifier">T</span></code> of <code class="computeroutput"><span class="identifier">v</span></code>.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Example:</strong></span>
-<pre class="programlisting"><span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&gt;</span> <span class="identifier">calculate_foo</span><span class="special">()</span>
-<span class="special">{</span>
- <span class="keyword">double</span> <span class="identifier">val</span> <span class="special">=</span> <span class="identifier">compute_foo</span><span class="special">();</span>
- <span class="keyword">return</span> <span class="identifier">make_optional</span><span class="special">(</span><span class="identifier">is_not_nan_and_finite</span><span class="special">(</span><span class="identifier">val</span><span class="special">),</span><span class="identifier">val</span><span class="special">);</span>
-<span class="special">}</span>
-
-<span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&gt;</span> <span class="identifier">v</span> <span class="special">=</span> <span class="identifier">calculate_foo</span><span class="special">();</span>
-<span class="keyword">if</span> <span class="special">(</span> <span class="special">!</span><span class="identifier">v</span> <span class="special">)</span>
- <span class="identifier">error</span><span class="special">(</span><span class="string">"foo wasn't computed"</span><span class="special">);</span>
-</pre>
- </li>
-</ul></div>
-<p>
- <span class="inlinemediaobject"><img src="../../images/space.png" alt="space"></span>
- </p>
-<a name="reference_operator_compare_equal_optional_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="keyword">bool</span> <span class="keyword">operator</span>
- <span class="special">==</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">y</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">T</span></code>
- shall meet requirements of <a href="http://www.sgi.com/tech/stl/EqualityComparable.html" target="_top"><code class="computeroutput"><span class="identifier">EqualityComparable</span></code></a>.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Returns:</strong></span> If both <code class="computeroutput"><span class="identifier">x</span></code>
- and <code class="computeroutput"><span class="identifier">y</span></code> are initialized,
- <code class="computeroutput"><span class="special">(*</span><span class="identifier">x</span>
- <span class="special">==</span> <span class="special">*</span><span class="identifier">y</span><span class="special">)</span></code>.
- If only <code class="computeroutput"><span class="identifier">x</span></code> or <code class="computeroutput"><span class="identifier">y</span></code> is initialized, <code class="computeroutput"><span class="keyword">false</span></code>.
- If both are uninitialized, <code class="computeroutput"><span class="keyword">true</span></code>.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Notes:</strong></span> Pointers have shallow relational
- operators while <code class="computeroutput"><span class="identifier">optional</span></code>
- has deep relational operators. Do not use <code class="computeroutput"><span class="keyword">operator</span><span class="special">==</span></code> directly in generic code which expect
- to be given either an <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code> or a pointer; use <a href="../../../../../utility/OptionalPointee.html#equal" target="_top"><code class="computeroutput"><span class="identifier">equal_pointees</span><span class="special">()</span></code></a>
- instead
- </li>
-<li class="listitem">
- <span class="bold"><strong>Example:</strong></span>
-<pre class="programlisting"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">oN</span><span class="special">,</span> <span class="identifier">oN_</span><span class="special">;</span>
-<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">o1</span><span class="special">(</span><span class="identifier">T</span><span class="special">(</span><span class="number">1</span><span class="special">)),</span> <span class="identifier">o1_</span><span class="special">(</span><span class="identifier">T</span><span class="special">(</span><span class="number">1</span><span class="special">));</span>
-<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">o2</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="identifier">assert</span> <span class="special">(</span> <span class="identifier">oN</span> <span class="special">==</span> <span class="identifier">oN</span> <span class="special">);</span> <span class="comment">// Identity implies equality</span>
-<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">o1</span> <span class="special">==</span> <span class="identifier">o1</span> <span class="special">);</span> <span class="comment">//</span>
-
-<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">oN</span> <span class="special">==</span> <span class="identifier">oN_</span> <span class="special">);</span> <span class="comment">// Both uninitialized compare equal</span>
-
-<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">oN</span> <span class="special">!=</span> <span class="identifier">o1</span> <span class="special">);</span> <span class="comment">// Initialized unequal to initialized.</span>
-
-<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">o1</span> <span class="special">==</span> <span class="identifier">o1_</span> <span class="special">);</span> <span class="comment">// Both initialized compare as (*lhs == *rhs)</span>
-<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">o1</span> <span class="special">!=</span> <span class="identifier">o2</span> <span class="special">);</span> <span class="comment">//</span>
-</pre>
- </li>
-</ul></div>
-<p>
- <span class="inlinemediaobject"><img src="../../images/space.png" alt="space"></span>
- </p>
-<a name="reference_operator_compare_less_optional_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="keyword">bool</span> <span class="keyword">operator</span>
- <span class="special">&lt;</span> <span class="special">(</span>
- <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">y</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> Expression <code class="computeroutput"><span class="special">*</span><span class="identifier">x</span> <span class="special">&lt;</span> <span class="special">*</span><span class="identifier">y</span></code>
- shall be well-formed and its result shall be convertible to <code class="computeroutput"><span class="keyword">bool</span></code>.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Returns:</strong></span> <code class="computeroutput"><span class="special">(!</span><span class="identifier">y</span><span class="special">)</span> <span class="special">?</span> <span class="keyword">false</span> <span class="special">:</span> <span class="special">(!</span><span class="identifier">x</span><span class="special">)</span> <span class="special">?</span> <span class="keyword">true</span>
- <span class="special">:</span> <span class="special">*</span><span class="identifier">x</span> <span class="special">&lt;</span> <span class="special">*</span><span class="identifier">y</span></code>.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Notes:</strong></span> Pointers have shallow relational
- operators while <code class="computeroutput"><span class="identifier">optional</span></code>
- has deep relational operators. Do not use <code class="computeroutput"><span class="keyword">operator</span><span class="special">&lt;</span></code> directly in generic code which expect
- to be given either an <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code> or a pointer; use <a href="../../../../../utility/OptionalPointee.html#less" target="_top"><code class="computeroutput"><span class="identifier">less_pointees</span><span class="special">()</span></code></a>
- instead. <code class="computeroutput"><span class="identifier">T</span></code> need not be
- <a href="http://www.sgi.com/tech/stl/LessThanComparable.html" target="_top"><code class="computeroutput"><span class="identifier">LessThanComparable</span></code></a>. Only single
- <code class="computeroutput"><span class="keyword">operator</span><span class="special">&lt;</span></code>
- is required. Other relational operations are defined in terms of this
- one. If <code class="computeroutput"><span class="identifier">T</span></code>'s <code class="computeroutput"><span class="keyword">operator</span><span class="special">&lt;</span></code>
- satisfies the axioms of <a href="http://www.sgi.com/tech/stl/LessThanComparable.html" target="_top"><code class="computeroutput"><span class="identifier">LessThanComparable</span></code></a> (transitivity,
- antisymmetry and irreflexivity), <code class="computeroutput"><span class="identifier">optinal</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code> is <a href="http://www.sgi.com/tech/stl/LessThanComparable.html" target="_top"><code class="computeroutput"><span class="identifier">LessThanComparable</span></code></a>.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Example:</strong></span>
-<pre class="programlisting"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">oN</span><span class="special">,</span> <span class="identifier">oN_</span><span class="special">;</span>
-<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">o0</span><span class="special">(</span><span class="identifier">T</span><span class="special">(</span><span class="number">0</span><span class="special">));</span>
-<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">o1</span><span class="special">(</span><span class="identifier">T</span><span class="special">(</span><span class="number">1</span><span class="special">));</span>
-
-<span class="identifier">assert</span> <span class="special">(</span> <span class="special">!(</span><span class="identifier">oN</span> <span class="special">&lt;</span> <span class="identifier">oN</span><span class="special">)</span> <span class="special">);</span> <span class="comment">// Identity implies equivalence</span>
-<span class="identifier">assert</span> <span class="special">(</span> <span class="special">!(</span><span class="identifier">o1</span> <span class="special">&lt;</span> <span class="identifier">o1</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">oN</span> <span class="special">&lt;</span> <span class="identifier">oN_</span><span class="special">)</span> <span class="special">);</span> <span class="comment">// Two uninitialized are equivalent</span>
-<span class="identifier">assert</span> <span class="special">(</span> <span class="special">!(</span><span class="identifier">oN_</span> <span class="special">&lt;</span> <span class="identifier">oN</span><span class="special">)</span> <span class="special">);</span>
-
-<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">oN</span> <span class="special">&lt;</span> <span class="identifier">o0</span> <span class="special">);</span> <span class="comment">// Uninitialized is less than initialized</span>
-<span class="identifier">assert</span> <span class="special">(</span> <span class="special">!(</span><span class="identifier">o0</span> <span class="special">&lt;</span> <span class="identifier">oN</span><span class="special">)</span> <span class="special">);</span>
-
-<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">o1</span> <span class="special">&lt;</span> <span class="identifier">o2</span> <span class="special">)</span> <span class="special">;</span> <span class="comment">// Two initialized compare as (*lhs &lt; *rhs)</span>
-<span class="identifier">assert</span> <span class="special">(</span> <span class="special">!(</span><span class="identifier">o2</span> <span class="special">&lt;</span> <span class="identifier">o1</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">o2</span> <span class="special">&lt;</span> <span class="identifier">o2</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>
-<a name="reference_operator_compare_not_equal_optional_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="keyword">bool</span> <span class="keyword">operator</span>
- <span class="special">!=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">y</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>Returns: </strong></span> <code class="computeroutput"><span class="special">!(</span>
- <span class="identifier">x</span> <span class="special">==</span>
- <span class="identifier">y</span> <span class="special">);</span></code>
- </li></ul></div>
-<p>
- <span class="inlinemediaobject"><img src="../../images/space.png" alt="space"></span>
- </p>
-<a name="reference_operator_compare_greater_optional_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="keyword">bool</span> <span class="keyword">operator</span>
- <span class="special">&gt;</span> <span class="special">(</span>
- <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">y</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>Returns: </strong></span> <code class="computeroutput"><span class="special">(</span>
- <span class="identifier">y</span> <span class="special">&lt;</span>
- <span class="identifier">x</span> <span class="special">);</span></code>
- </li></ul></div>
-<p>
- <span class="inlinemediaobject"><img src="../../images/space.png" alt="space"></span>
- </p>
-<a name="reference_operator_compare_less_or_equal_optional_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="keyword">bool</span> <span class="keyword">operator</span>
- <span class="special">&lt;=</span> <span class="special">(</span>
- <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">y</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>Returns: </strong></span> <code class="computeroutput"><span class="special">!(</span>
- <span class="identifier">y</span> <span class="special">&lt;</span>
- <span class="identifier">x</span> <span class="special">);</span></code>
- </li></ul></div>
-<p>
- <span class="inlinemediaobject"><img src="../../images/space.png" alt="space"></span>
- </p>
-<a name="reference_operator_compare_greater_or_equal_optional_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="keyword">bool</span> <span class="keyword">operator</span>
- <span class="special">&gt;=</span> <span class="special">(</span>
- <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">y</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>Returns: </strong></span> <code class="computeroutput"><span class="special">!(</span>
- <span class="identifier">x</span> <span class="special">&lt;</span>
- <span class="identifier">y</span> <span class="special">);</span></code>
- </li></ul></div>
-<p>
- <span class="inlinemediaobject"><img src="../../images/space.png" alt="space"></span>
- </p>
-<a name="reference_operator_compare_equal_optional_none"></a><div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="keyword">bool</span> <span class="keyword">operator</span>
- <span class="special">==</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">none_t</span>
- <span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span></code>
- </p></blockquote></div>
-<div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="keyword">bool</span> <span class="keyword">operator</span>
- <span class="special">==</span> <span class="special">(</span> <span class="identifier">none_t</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span> <span class="special">)</span> <span class="keyword">noexcept</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>Returns:</strong></span> <code class="computeroutput"><span class="special">!</span><span class="identifier">x</span></code>.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Notes:</strong></span> <code class="computeroutput"><span class="identifier">T</span></code>
- need not meet requirements of <a href="http://www.sgi.com/tech/stl/EqualityComparable.html" target="_top"><code class="computeroutput"><span class="identifier">EqualityComparable</span></code></a>.
- </li>
-</ul></div>
-<p>
- <span class="inlinemediaobject"><img src="../../images/space.png" alt="space"></span>
- </p>
-<a name="reference_operator_compare_not_equal_optional_none"></a><div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="keyword">bool</span> <span class="keyword">operator</span>
- <span class="special">!=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">none_t</span>
- <span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span></code>
- </p></blockquote></div>
-<div class="blockquote"><blockquote class="blockquote"><p>
- <code class="computeroutput"><span class="keyword">bool</span> <span class="keyword">operator</span>
- <span class="special">!=</span> <span class="special">(</span> <span class="identifier">none_t</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span> <span class="special">)</span> <span class="keyword">noexcept</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>Returns: </strong></span> <code class="computeroutput"><span class="special">!(</span>
- <span class="identifier">x</span> <span class="special">==</span>
- <span class="identifier">y</span> <span class="special">);</span></code>
- </li></ul></div>
-<p>
- <span class="inlinemediaobject"><img src="../../images/space.png" alt="space"></span>
- </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>
- <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&amp;</span> <span class="identifier">y</span>
- <span class="special">)</span> <span class="special">;</span></code>
- </p></blockquote></div>
-<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
-<li class="listitem">
- <span class="bold"><strong>Requires:</strong></span> Lvalues of type <code class="computeroutput"><span class="identifier">T</span></code> shall be swappable and <code class="computeroutput"><span class="identifier">T</span></code> shall be <code class="computeroutput"><span class="identifier">MoveConstructible</span></code>.
- </li>
-<li class="listitem">
- <span class="bold"><strong>Effects:</strong></span>
- <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: circle; ">
-<li class="listitem">
- If <code class="computeroutput"><span class="special">!*</span><span class="keyword">this</span>
- <span class="special">&amp;&amp;</span> <span class="special">!</span><span class="identifier">rhs</span></code>, no effect, otherwise
- </li>
-<li class="listitem">
- if <code class="computeroutput"><span class="keyword">bool</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span>
- <span class="special">&amp;&amp;</span> <span class="special">!</span><span class="identifier">rhs</span></code>, initializes the contained
- value of <code class="computeroutput"><span class="identifier">rhs</span></code> as
- if direct-initializing an object of type <code class="computeroutput"><span class="identifier">T</span></code>
- with the expression <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(*(*</span><span class="keyword">this</span><span class="special">))</span></code>, followed by <code class="computeroutput"><span class="identifier">val</span><span class="special">-&gt;</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="special">*</span><span class="keyword">this</span></code> does not contain a value and
- <code class="computeroutput"><span class="identifier">rhs</span></code> contains a
- value, otherwise
- </li>
-<li class="listitem">
- if <code class="computeroutput"><span class="special">!*</span><span class="keyword">this</span>
- <span class="special">&amp;&amp;</span> <span class="keyword">bool</span><span class="special">(</span><span class="identifier">rhs</span><span class="special">)</span></code>, initializes the contained value
- of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
- as if direct-initializing an object of type <code class="computeroutput"><span class="identifier">T</span></code>
- with the expression <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(*</span><span class="identifier">rhs</span><span class="special">)</span></code>, followed by <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">val</span><span class="special">-&gt;</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="special">*</span><span class="keyword">this</span></code> contains a value and <code class="computeroutput"><span class="identifier">rhs</span></code> does not contain a value,
- otherwise
- </li>
-<li class="listitem">
- (if <code class="computeroutput"><span class="keyword">bool</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span>
- <span class="special">&amp;&amp;</span> <span class="keyword">bool</span><span class="special">(</span><span class="identifier">rhs</span><span class="special">)</span></code>) calls <code class="computeroutput"><span class="identifier">swap</span><span class="special">(*(*</span><span class="keyword">this</span><span class="special">),</span> <span class="special">*</span><span class="identifier">rhs</span><span class="special">)</span></code>.
- </li>
-</ul></div>
- </li>
-<li class="listitem">
- <span class="bold"><strong>Postconditions:</strong></span> The states of <code class="computeroutput"><span class="identifier">x</span></code> and <code class="computeroutput"><span class="identifier">y</span></code>
- interchanged.
- </li>
-<li class="listitem">
- <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">&amp;,</span><span class="identifier">T</span><span class="special">&amp;)</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="special">&amp;&amp;</span> <span class="special">)</span></code>
- throws.
- </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="number">12</span><span class="special">);</span>
-<span class="identifier">T</span> <span class="identifier">y</span><span class="special">(</span><span class="number">21</span><span class="special">);</span>
-<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">def0</span> <span class="special">;</span>
-<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">def1</span> <span class="special">;</span>
-<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">optX</span><span class="special">(</span><span class="identifier">x</span><span class="special">);</span>
-<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">optY</span><span class="special">(</span><span class="identifier">y</span><span class="special">);</span>
-
-<span class="identifier">boost</span><span class="special">::</span><span class="identifier">swap</span><span class="special">(</span><span class="identifier">def0</span><span class="special">,</span><span class="identifier">def1</span><span class="special">);</span> <span class="comment">// no-op</span>
-
-<span class="identifier">boost</span><span class="special">::</span><span class="identifier">swap</span><span class="special">(</span><span class="identifier">def0</span><span class="special">,</span><span class="identifier">optX</span><span class="special">);</span>
-<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">def0</span> <span class="special">==</span> <span class="identifier">x</span> <span class="special">);</span>
-<span class="identifier">assert</span> <span class="special">(</span> <span class="special">!</span><span class="identifier">optX</span> <span class="special">);</span>
-
-<span class="identifier">boost</span><span class="special">::</span><span class="identifier">swap</span><span class="special">(</span><span class="identifier">def0</span><span class="special">,</span><span class="identifier">optX</span><span class="special">);</span> <span class="comment">// Get back to original values</span>
-
-<span class="identifier">boost</span><span class="special">::</span><span class="identifier">swap</span><span class="special">(</span><span class="identifier">optX</span><span class="special">,</span><span class="identifier">optY</span><span class="special">);</span>
-<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">optX</span> <span class="special">==</span> <span class="identifier">y</span> <span class="special">);</span>
-<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">optY</span> <span class="special">==</span> <span class="identifier">x</span> <span class="special">);</span>
-</pre>
- </li>
-</ul></div>
-</div>
-<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
-<td align="left"></td>
-<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014 Andrzej Krzemie&#324;ski<p>
- Distributed under the Boost Software License, Version 1.0. (See accompanying
- file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
- </p>
-</div></td>
-</tr></table>
-<hr>
-<div class="spirit-nav">
-<a accesskey="p" href="../../optional/reference.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../optional/reference.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../dependencies_and_portability.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
-</div>
-</body>
-</html>
diff --git a/libs/optional/doc/html/boost_optional/reference/header__boost_optional_bad_optional_access_hpp_.html b/libs/optional/doc/html/boost_optional/reference/header__boost_optional_bad_optional_access_hpp_.html
new file mode 100644
index 000000000..e0d8ba9ca
--- /dev/null
+++ b/libs/optional/doc/html/boost_optional/reference/header__boost_optional_bad_optional_access_hpp_.html
@@ -0,0 +1,63 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Header &lt;boost/optional/bad_optional_access.hpp&gt;</title>
+<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<link rel="home" href="../../index.html" title="Boost.Optional">
+<link rel="up" href="../../optional/reference.html" title="Reference">
+<link rel="prev" href="../../optional/reference.html" title="Reference">
+<link rel="next" href="header__boost_optional_bad_optional_access_hpp_/detailed_semantics.html" title="Detailed semantics">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td>
+<td align="center"><a href="../../../../../../index.html">Home</a></td>
+<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td>
+<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
+<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
+<td align="center"><a href="../../../../../../more/index.htm">More</a></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="../../optional/reference.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../optional/reference.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="header__boost_optional_bad_optional_access_hpp_/detailed_semantics.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="boost_optional.reference.header__boost_optional_bad_optional_access_hpp_"></a><a class="link" href="header__boost_optional_bad_optional_access_hpp_.html" title="Header &lt;boost/optional/bad_optional_access.hpp&gt;">Header
+ &lt;boost/optional/bad_optional_access.hpp&gt;</a>
+</h3></div></div></div>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_optional.reference.header__boost_optional_bad_optional_access_hpp_.synopsis"></a><a class="link" href="header__boost_optional_bad_optional_access_hpp_.html#boost_optional.reference.header__boost_optional_bad_optional_access_hpp_.synopsis" title="Synopsis">Synopsis</a>
+</h4></div></div></div>
+<p>
+</p>
+<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
+
+<span class="keyword">class</span> <span class="identifier">bad_optional_access</span> <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">logic_error</span>
+<span class="special">{</span>
+<span class="keyword">public</span><span class="special">:</span>
+ <span class="identifier">bad_optional_access</span><span class="special">();</span> <a class="link" href="header__boost_optional_bad_optional_access_hpp_/detailed_semantics.html#reference_bad_optional_access_constructor"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
+<span class="special">};</span>
+
+<span class="special">}</span> <span class="comment">// namespace boost</span>
+</pre>
+<p>
+ </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014, 2015 Andrzej Krzemie&#324;ski<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="../../optional/reference.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../optional/reference.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="header__boost_optional_bad_optional_access_hpp_/detailed_semantics.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
diff --git a/libs/optional/doc/html/boost_optional/reference/header__boost_optional_bad_optional_access_hpp_/detailed_semantics.html b/libs/optional/doc/html/boost_optional/reference/header__boost_optional_bad_optional_access_hpp_/detailed_semantics.html
new file mode 100644
index 000000000..2b69cac08
--- /dev/null
+++ b/libs/optional/doc/html/boost_optional/reference/header__boost_optional_bad_optional_access_hpp_/detailed_semantics.html
@@ -0,0 +1,60 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Detailed semantics</title>
+<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<link rel="home" href="../../../index.html" title="Boost.Optional">
+<link rel="up" href="../header__boost_optional_bad_optional_access_hpp_.html" title="Header &lt;boost/optional/bad_optional_access.hpp&gt;">
+<link rel="prev" href="../header__boost_optional_bad_optional_access_hpp_.html" title="Header &lt;boost/optional/bad_optional_access.hpp&gt;">
+<link rel="next" href="../io_header.html" title="Header &lt;boost/optional/optional_io.hpp&gt;">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td>
+<td align="center"><a href="../../../../../../../index.html">Home</a></td>
+<td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td>
+<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
+<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
+<td align="center"><a href="../../../../../../../more/index.htm">More</a></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="../header__boost_optional_bad_optional_access_hpp_.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../header__boost_optional_bad_optional_access_hpp_.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../io_header.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_optional.reference.header__boost_optional_bad_optional_access_hpp_.detailed_semantics"></a><a class="link" href="detailed_semantics.html" title="Detailed semantics">Detailed
+ semantics</a>
+</h4></div></div></div>
+<p>
+ <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
+ </p>
+<p>
+ <a name="reference_bad_optional_access_constructor"></a><code class="computeroutput"><span class="identifier">bad_optional_access</span><span class="special">();</span></code>
+ </p>
+<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
+<li class="listitem">
+ <span class="bold"><strong>Effect:</strong></span> Constructs an object of class
+ <code class="computeroutput"><span class="identifier">bad_optional_access</span></code>.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Postconditions:</strong></span> <code class="computeroutput"><span class="identifier">what</span><span class="special">()</span></code> returns an implementation-defined
+ NTBS.
+ </li>
+</ul></div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014, 2015 Andrzej Krzemie&#324;ski<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="../header__boost_optional_bad_optional_access_hpp_.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../header__boost_optional_bad_optional_access_hpp_.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../io_header.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
diff --git a/libs/optional/doc/html/boost_optional/reference/header__boost_optional_hpp_.html b/libs/optional/doc/html/boost_optional/reference/header__boost_optional_hpp_.html
new file mode 100644
index 000000000..19ed6cf5a
--- /dev/null
+++ b/libs/optional/doc/html/boost_optional/reference/header__boost_optional_hpp_.html
@@ -0,0 +1,47 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Header &lt;boost/optional.hpp&gt;</title>
+<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<link rel="home" href="../../index.html" title="Boost.Optional">
+<link rel="up" href="../../optional/reference.html" title="Reference">
+<link rel="prev" href="header__boost_optional_optional_hpp_/detailed_semantics.html" title="Detailed Semantics">
+<link rel="next" href="../dependencies_and_portability.html" title="Dependencies and Portability">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td>
+<td align="center"><a href="../../../../../../index.html">Home</a></td>
+<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td>
+<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
+<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
+<td align="center"><a href="../../../../../../more/index.htm">More</a></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="header__boost_optional_optional_hpp_/detailed_semantics.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../optional/reference.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../dependencies_and_portability.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="boost_optional.reference.header__boost_optional_hpp_"></a><a class="link" href="header__boost_optional_hpp_.html" title="Header &lt;boost/optional.hpp&gt;">Header
+ &lt;boost/optional.hpp&gt;</a>
+</h3></div></div></div>
+<p>
+ This is an alias for header <a class="link" href="../../optional/reference/header__boost_optional_optional_hpp_.html#boost_optional.reference.header__boost_optional_optional_hpp_.header_optional_optional" title="Synopsis"><code class="computeroutput"><span class="special">&lt;</span><span class="identifier">boost</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">hpp</span><span class="special">&gt;</span></code></a>.
+ </p>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014, 2015 Andrzej Krzemie&#324;ski<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="header__boost_optional_optional_hpp_/detailed_semantics.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../optional/reference.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../dependencies_and_portability.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
diff --git a/libs/optional/doc/html/boost_optional/reference/header__boost_optional_optional_fwd_hpp_.html b/libs/optional/doc/html/boost_optional/reference/header__boost_optional_optional_fwd_hpp_.html
new file mode 100644
index 000000000..d87a47382
--- /dev/null
+++ b/libs/optional/doc/html/boost_optional/reference/header__boost_optional_optional_fwd_hpp_.html
@@ -0,0 +1,66 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Header &lt;boost/optional/optional_fwd.hpp&gt;</title>
+<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<link rel="home" href="../../index.html" title="Boost.Optional">
+<link rel="up" href="../../optional/reference.html" title="Reference">
+<link rel="prev" href="io_header/io_semantics.html" title="Detailed semantics">
+<link rel="next" href="../../optional/reference/header__boost_optional_optional_hpp_.html" title="Header &lt;boost/optional/optional.hpp&gt;">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td>
+<td align="center"><a href="../../../../../../index.html">Home</a></td>
+<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td>
+<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
+<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
+<td align="center"><a href="../../../../../../more/index.htm">More</a></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="io_header/io_semantics.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../optional/reference.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../../optional/reference/header__boost_optional_optional_hpp_.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="boost_optional.reference.header__boost_optional_optional_fwd_hpp_"></a><a class="link" href="header__boost_optional_optional_fwd_hpp_.html" title="Header &lt;boost/optional/optional_fwd.hpp&gt;">Header
+ &lt;boost/optional/optional_fwd.hpp&gt;</a>
+</h3></div></div></div>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_optional.reference.header__boost_optional_optional_fwd_hpp_.synopsis"></a><a class="link" href="header__boost_optional_optional_fwd_hpp_.html#boost_optional.reference.header__boost_optional_optional_fwd_hpp_.synopsis" title="Synopsis">Synopsis</a>
+</h4></div></div></div>
+<p>
+</p>
+<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
+
+<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">class</span> <span class="identifier">optional</span> <span class="special">;</span>
+
+<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">void</span> <span class="identifier">swap</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&amp;</span> <span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&amp;</span> <span class="special">);</span>
+
+<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">optional_swap_should_use_default_constructor</span> <span class="special">;</span>
+
+<span class="special">}</span> <span class="comment">// namespace boost</span>
+</pre>
+<p>
+ </p>
+<p>
+ This header only contains declarations.
+ </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014, 2015 Andrzej Krzemie&#324;ski<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="io_header/io_semantics.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../optional/reference.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../../optional/reference/header__boost_optional_optional_hpp_.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
diff --git a/libs/optional/doc/html/boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html b/libs/optional/doc/html/boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html
new file mode 100644
index 000000000..a54a5834a
--- /dev/null
+++ b/libs/optional/doc/html/boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html
@@ -0,0 +1,2387 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Detailed Semantics</title>
+<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<link rel="home" href="../../../index.html" title="Boost.Optional">
+<link rel="up" href="../../../optional/reference/header__boost_optional_optional_hpp_.html" title="Header &lt;boost/optional/optional.hpp&gt;">
+<link rel="prev" href="../../../optional/reference/header__boost_optional_optional_hpp_.html" title="Header &lt;boost/optional/optional.hpp&gt;">
+<link rel="next" href="../header__boost_optional_hpp_.html" title="Header &lt;boost/optional.hpp&gt;">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td>
+<td align="center"><a href="../../../../../../../index.html">Home</a></td>
+<td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td>
+<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
+<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
+<td align="center"><a href="../../../../../../../more/index.htm">More</a></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="../../../optional/reference/header__boost_optional_optional_hpp_.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../../optional/reference/header__boost_optional_optional_hpp_.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../header__boost_optional_hpp_.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_optional.reference.header__boost_optional_optional_hpp_.detailed_semantics"></a><a class="link" href="detailed_semantics.html" title="Detailed Semantics">Detailed
+ Semantics</a>
+</h4></div></div></div>
+<p>
+ Because <code class="computeroutput"><span class="identifier">T</span></code> might be of reference
+ type, in the sequel, those entries whose semantic depends on <code class="computeroutput"><span class="identifier">T</span></code> being of reference type or not will
+ be distinguished using the following convention:
+ </p>
+<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
+<li class="listitem">
+ If the entry reads: <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code><span class="emphasis"><em>(not
+ a ref)</em></span><code class="computeroutput"><span class="special">&gt;</span></code>,
+ the description corresponds only to the case where <code class="computeroutput"><span class="identifier">T</span></code>
+ is not of reference type.
+ </li>
+<li class="listitem">
+ If the entry reads: <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span></code>, the description corresponds
+ only to the case where <code class="computeroutput"><span class="identifier">T</span></code>
+ is of reference type.
+ </li>
+<li class="listitem">
+ If the entry reads: <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code>, the description is the same for
+ both cases.
+ </li>
+</ul></div>
+<div class="note"><table border="0" summary="Note">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../../doc/src/images/note.png"></td>
+<th align="left">Note</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+ The following section contains various <code class="computeroutput"><span class="identifier">assert</span><span class="special">()</span></code> which are used only to show the postconditions
+ as sample code. It is not implied that the type <code class="computeroutput"><span class="identifier">T</span></code>
+ must support each particular expression but that if the expression is
+ supported, the implied condition holds.
+ </p></td></tr>
+</table></div>
+<p>
+ <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
+ </p>
+<h6>
+<a name="boost_optional.reference.header__boost_optional_optional_hpp_.detailed_semantics.h0"></a>
+ <span class="phrase"><a name="boost_optional.reference.header__boost_optional_optional_hpp_.detailed_semantics.optional_class_member_functions"></a></span><a class="link" href="detailed_semantics.html#boost_optional.reference.header__boost_optional_optional_hpp_.detailed_semantics.optional_class_member_functions">optional
+ class member functions</a>
+ </h6>
+<p>
+ <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
+ </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">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">optional</span><span class="special">()</span>
+ <span class="keyword">noexcept</span><span class="special">;</span></code>
+ </p></blockquote></div>
+<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
+<li class="listitem">
+ <span class="bold"><strong>Effect:</strong></span> Default-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">uninitialized</span>.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Notes:</strong></span> T's default constructor <span class="underline">is not</span> called.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Example:</strong></span>
+<pre class="programlisting"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">def</span> <span class="special">;</span>
+<span class="identifier">assert</span> <span class="special">(</span> <span class="special">!</span><span class="identifier">def</span> <span class="special">)</span> <span class="special">;</span>
+</pre>
+ </li>
+</ul></div>
+<p>
+ <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
+ </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">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">optional</span><span class="special">(</span>
+ <span class="identifier">none_t</span> <span class="special">)</span>
+ <span class="keyword">noexcept</span><span class="special">;</span></code>
+ </p></blockquote></div>
+<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
+<li class="listitem">
+ <span class="bold"><strong>Effect:</strong></span> Constructs an <code class="computeroutput"><span class="identifier">optional</span></code> uninitialized.
+ </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">uninitialized</span>.
+ </li>
+<li class="listitem">
+ <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.
+ The expression <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">none</span></code>
+ denotes an instance of <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">none_t</span></code>
+ that can be used as the parameter.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Example:</strong></span>
+<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">none</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
+<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">n</span><span class="special">(</span><span class="identifier">none</span><span class="special">)</span> <span class="special">;</span>
+<span class="identifier">assert</span> <span class="special">(</span> <span class="special">!</span><span class="identifier">n</span> <span class="special">)</span> <span class="special">;</span>
+</pre>
+ </li>
+</ul></div>
+<p>
+ <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
+ </p>
+<a name="reference_optional_constructor_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span> </code><span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">optional</span><span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">v</span> <span class="special">)</span></code>
+ </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_copy_constructible</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</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-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 a <span class="emphasis"><em>copy</em></span> of <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="keyword">const</span><span class="special">&amp;</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="keyword">const</span><span class="special">&amp;</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="keyword">const</span><span class="special">&amp;</span>
+ <span class="special">);</span></code> in that case, this constructor
+ has no effect.
+ </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">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">opt</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span>
+<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">opt</span> <span class="special">==</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span>
+</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">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;::</span><span class="identifier">optional</span><span class="special">(</span>
+ <span class="identifier">T</span><span class="special">&amp;</span>
+ <span class="identifier">ref</span> <span class="special">)</span></code>
+ </p></blockquote></div>
+<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
+<li class="listitem">
+ <span class="bold"><strong>Effect:</strong></span> Directly-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 an instance of an internal type wrapping the reference
+ <code class="computeroutput"><span class="identifier">ref</span></code>.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Throws:</strong></span> Nothing.
+ </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">T</span><span class="special">&amp;</span> <span class="identifier">vref</span> <span class="special">=</span> <span class="identifier">v</span> <span class="special">;</span>
+<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span> <span class="identifier">opt</span><span class="special">(</span><span class="identifier">vref</span><span class="special">);</span>
+<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">opt</span> <span class="special">==</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span>
+<span class="special">++</span> <span class="identifier">v</span> <span class="special">;</span> <span class="comment">// mutate referee</span>
+<span class="identifier">assert</span> <span class="special">(*</span><span class="identifier">opt</span> <span class="special">==</span> <span class="identifier">v</span><span class="special">);</span>
+</pre>
+ </li>
+</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">&lt;</span><span class="identifier">T</span> </code><span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">optional</span><span class="special">(</span> <span class="identifier">T</span><span class="special">&amp;&amp;</span> <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">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</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">&amp;&amp;</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">&amp;&amp;</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">&amp;&amp;</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">&amp;&amp;)</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">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">opt</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">v1</span><span class="special">));</span>
+<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">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;::</span><span class="identifier">optional</span><span class="special">(</span>
+ <span class="identifier">T</span><span class="special">&amp;&amp;</span>
+ <span class="identifier">ref</span> <span class="special">)</span>
+ <span class="special">=</span> <span class="keyword">delete</span></code>
+ </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>
+ <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
+ </p>
+<a name="reference_optional_constructor_bool_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">optional</span><span class="special">(</span> <span class="keyword">bool</span> <span class="identifier">condition</span><span class="special">,</span>
+ <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span></code>
+ </p></blockquote></div>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span>
+ <span class="special">::</span><span class="identifier">optional</span><span class="special">(</span> <span class="keyword">bool</span> <span class="identifier">condition</span><span class="special">,</span>
+ <span class="identifier">T</span><span class="special">&amp;</span>
+ <span class="identifier">v</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">
+ If condition is true, same as:
+ </li></ul></div>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">optional</span><span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">v</span> <span class="special">)</span></code>
+ </p></blockquote></div>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span>
+ <span class="special">::</span><span class="identifier">optional</span><span class="special">(</span> <span class="identifier">T</span><span class="special">&amp;</span> <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">
+ otherwise, same as:
+ </li></ul></div>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span> </code><span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">optional</span><span class="special">()</span></code>
+ </p></blockquote></div>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span>
+ <span class="special">::</span><span class="identifier">optional</span><span class="special">()</span></code>
+ </p></blockquote></div>
+<p>
+ <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
+ </p>
+<a name="reference_optional_constructor_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span> </code><span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">optional</span><span class="special">(</span> <span class="identifier">optional</span>
+ <span class="keyword">const</span><span class="special">&amp;</span>
+ <span class="identifier">rhs</span> <span class="special">);</span></code>
+ </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_copy_constructible</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</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> Copy-Constructs an <code class="computeroutput"><span class="identifier">optional</span></code>.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Postconditions:</strong></span> If rhs is initialized,
+ <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
+ is initialized and its value is a <span class="emphasis"><em>copy</em></span> of 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="identifier">T</span><span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span>
+ <span class="special">)</span></code> throws.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Notes:</strong></span> If rhs is initialized, <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">)</span></code>
+ 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="keyword">const</span><span class="special">&amp;</span>
+ <span class="special">);</span></code> in that case, this constructor
+ has no effect.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Example:</strong></span>
+<pre class="programlisting"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">uninit</span> <span class="special">;</span>
+<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">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">uinit2</span> <span class="special">(</span> <span class="identifier">uninit</span> <span class="special">)</span> <span class="special">;</span>
+<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">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">init</span><span class="special">(</span> <span class="identifier">T</span><span class="special">(</span><span class="number">2</span><span class="special">)</span> <span class="special">);</span>
+<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">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">init2</span> <span class="special">(</span> <span class="identifier">init</span> <span class="special">)</span> <span class="special">;</span>
+<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">init2</span> <span class="special">==</span> <span class="identifier">init</span> <span class="special">)</span> <span class="special">;</span>
+</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">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;::</span><span class="identifier">optional</span><span class="special">(</span>
+ <span class="identifier">optional</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rhs</span>
+ <span class="special">);</span></code>
+ </p></blockquote></div>
+<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
+<li class="listitem">
+ <span class="bold"><strong>Effect:</strong></span> Copy-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 refer 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">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</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">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span> <span class="identifier">uinit2</span> <span class="special">(</span> <span class="identifier">uninit</span> <span class="special">)</span> <span class="special">;</span>
+<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">T</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">2</span> <span class="special">;</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">ref</span> <span class="special">=</span> <span class="identifier">v</span> <span class="special">;</span>
+<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">init</span><span class="special">(</span><span class="identifier">ref</span><span class="special">);</span>
+<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">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">init2</span> <span class="special">(</span> <span class="identifier">init</span> <span class="special">)</span> <span class="special">;</span>
+<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="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>
+ <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">&lt;</span><span class="identifier">T</span> </code><span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">optional</span><span class="special">(</span> <span class="identifier">optional</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span>
+ <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">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</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">&amp;&amp;</span> <span class="special">)</span></code>
+ throws.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Remarks:</strong></span> 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">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span></code>.
+ </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">&amp;&amp;</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">&amp;&amp;</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">&amp;&amp;)</span></code>.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Example:</strong></span>
+<pre class="programlisting"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">unique_ptr</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&gt;</span> <span class="identifier">uninit</span> <span class="special">;</span>
+<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">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">unique_ptr</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&gt;</span> <span class="identifier">uinit2</span> <span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">uninit</span><span class="special">)</span> <span class="special">)</span> <span class="special">;</span>
+<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">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">unique_ptr</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&gt;</span> <span class="identifier">init</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">uniqye_ptr</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;(</span><span class="keyword">new</span> <span class="identifier">T</span><span class="special">(</span><span class="number">2</span><span class="special">))</span> <span class="special">);</span>
+<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">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">unique_ptr</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&gt;</span> <span class="identifier">init2</span> <span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">init</span><span class="special">)</span> <span class="special">)</span> <span class="special">;</span>
+<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">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;::</span><span class="identifier">optional</span><span class="special">(</span>
+ <span class="identifier">optional</span> <span class="special">&amp;&amp;</span>
+ <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 refer 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">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">unique_ptr</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&amp;&gt;</span> <span class="identifier">uninit</span> <span class="special">;</span>
+<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">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">unique_ptr</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&amp;&gt;</span> <span class="identifier">uinit2</span> <span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">uninit</span><span class="special">)</span> <span class="special">)</span> <span class="special">;</span>
+<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">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">v</span><span class="special">(</span><span class="keyword">new</span> <span class="identifier">T</span><span class="special">(</span><span class="number">2</span><span class="special">))</span> <span class="special">;</span>
+<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">unique_ptr</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&amp;&gt;</span> <span class="identifier">init</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span>
+<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">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">unique_ptr</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&amp;&gt;</span> <span class="identifier">init2</span> <span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">init</span><span class="special">)</span> <span class="special">)</span> <span class="special">;</span>
+<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>
+ <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
+ </p>
+<a name="reference_optional_constructor_other_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;</span> <span class="keyword">explicit</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
+ <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">optional</span><span class="special">(</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rhs</span> <span class="special">);</span></code>
+ </p></blockquote></div>
+<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
+<li class="listitem">
+ <span class="bold"><strong>Effect:</strong></span> Copy-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 a <span class="emphasis"><em>copy</em></span> of the
+ value of rhs converted to type <code class="computeroutput"><span class="identifier">T</span></code>;
+ else <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
+ is 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="keyword">const</span><span class="special">&amp;</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="keyword">const</span><span class="special">&amp;</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="keyword">const</span><span class="special">&amp;</span>
+ <span class="special">);</span></code> in that case, this constructor
+ has no effect.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Example:</strong></span>
+<pre class="programlisting"><span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&gt;</span> <span class="identifier">x</span><span class="special">(</span><span class="number">123.4</span><span class="special">);</span>
+<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">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">y</span><span class="special">(</span><span class="identifier">x</span><span class="special">)</span> <span class="special">;</span>
+<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>
+ <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">&lt;</span><span class="identifier">U</span><span class="special">&gt;</span> <span class="keyword">explicit</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
+ <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">optional</span><span class="special">(</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;&amp;&amp;</span>
+ <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">&amp;&amp;</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">&amp;&amp;</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">&amp;&amp;</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">&amp;&amp;</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">&lt;</span><span class="keyword">double</span><span class="special">&gt;</span> <span class="identifier">x</span><span class="special">(</span><span class="number">123.4</span><span class="special">);</span>
+<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">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">y</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">x</span><span class="special">))</span> <span class="special">;</span>
+<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>
+ <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
+ </p>
+<a name="reference_optional_constructor_factory"></a><div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="identifier">InPlaceFactory</span><span class="special">&gt;</span>
+ <span class="keyword">explicit</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
+ <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">optional</span><span class="special">(</span>
+ <span class="identifier">InPlaceFactory</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">f</span> <span class="special">);</span></code>
+ </p></blockquote></div>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="identifier">TypedInPlaceFactory</span><span class="special">&gt;</span>
+ <span class="keyword">explicit</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
+ <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">optional</span><span class="special">(</span>
+ <span class="identifier">TypedInPlaceFactory</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">f</span> <span class="special">);</span></code>
+ </p></blockquote></div>
+<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
+<li class="listitem">
+ <span class="bold"><strong>Effect:</strong></span> Constructs an <code class="computeroutput"><span class="identifier">optional</span></code> with a value of <code class="computeroutput"><span class="identifier">T</span></code> obtained from the factory.
+ </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 <span class="emphasis"><em>directly given</em></span> from the factory
+ <code class="computeroutput"><span class="identifier">f</span></code> (i.e., the value
+ <span class="underline">is not copied</span>).
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Throws:</strong></span> Whatever the <code class="computeroutput"><span class="identifier">T</span></code> constructor called by the factory
+ throws.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Notes:</strong></span> See <a class="link" href="../../tutorial/in_place_factories.html" title="In-Place Factories">In-Place
+ Factories</a>
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Exception Safety:</strong></span> Exceptions can only
+ be thrown during the call to the <code class="computeroutput"><span class="identifier">T</span></code>
+ constructor used by the factory; in that case, this constructor has
+ no effect.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Example:</strong></span>
+<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">C</span> <span class="special">{</span> <span class="identifier">C</span> <span class="special">(</span> <span class="keyword">char</span><span class="special">,</span> <span class="keyword">double</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="special">)</span> <span class="special">;</span> <span class="special">}</span> <span class="special">;</span>
+
+<span class="identifier">C</span> <span class="identifier">v</span><span class="special">(</span><span class="char">'A'</span><span class="special">,</span><span class="number">123.4</span><span class="special">,</span><span class="string">"hello"</span><span class="special">);</span>
+
+<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">C</span><span class="special">&gt;</span> <span class="identifier">x</span><span class="special">(</span> <span class="identifier">in_place</span> <span class="special">(</span><span class="char">'A'</span><span class="special">,</span> <span class="number">123.4</span><span class="special">,</span> <span class="string">"hello"</span><span class="special">)</span> <span class="special">);</span> <span class="comment">// InPlaceFactory used</span>
+<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">C</span><span class="special">&gt;</span> <span class="identifier">y</span><span class="special">(</span> <span class="identifier">in_place</span><span class="special">&lt;</span><span class="identifier">C</span><span class="special">&gt;(</span><span class="char">'A'</span><span class="special">,</span> <span class="number">123.4</span><span class="special">,</span> <span class="string">"hello"</span><span class="special">)</span> <span class="special">);</span> <span class="comment">// TypedInPlaceFactory used</span>
+
+<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">x</span> <span class="special">==</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span>
+<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">y</span> <span class="special">==</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span>
+</pre>
+ </li>
+</ul></div>
+<p>
+ <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
+ </p>
+<a name="reference_optional_operator_equal_none_t"></a><div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="identifier">optional</span><span class="special">&amp;</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">none_t</span>
+ <span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span></code>
+ </p></blockquote></div>
+<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
+<li class="listitem">
+ <span class="bold"><strong>Effect:</strong></span> If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is initialized destroys its contained
+ value.
+ </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 uninitialized.
+ </li>
+</ul></div>
+<p>
+ <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
+ </p>
+<a name="reference_optional_operator_equal_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="identifier">optional</span><span class="special">&amp;</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">T</span>
+ <span class="keyword">const</span><span class="special">&amp;</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> Assigns 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
+ a <span class="emphasis"><em>copy</em></span> of <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="keyword">const</span><span class="special">&amp;</span>
+ <span class="special">)</span></code> or <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;)</span></code>
+ throws.
+ </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 assignment operator is used,
+ otherwise, its copy-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>copy 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">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">def</span> <span class="special">;</span>
+<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="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">y</span><span class="special">;</span>
+<span class="identifier">def</span> <span class="special">=</span> <span class="identifier">y</span> <span class="special">;</span>
+<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">def</span> <span class="special">==</span> <span class="identifier">y</span> <span class="special">)</span> <span class="special">;</span>
+<span class="identifier">opt</span> <span class="special">=</span> <span class="identifier">y</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">y</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">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;&amp;</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">T</span><span class="special">&amp;</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> (Re)binds the wrapped reference.
+ </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 it references
+ the same object referenced by <code class="computeroutput"><span class="identifier">rhs</span></code>.
+ </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, it is <span class="emphasis"><em>rebound</em></span>
+ to the new object. See <a class="link" href="../../tutorial/rebinding_semantics_for_assignment_of_optional_references.html" title="Rebinding semantics for assignment of optional references">here</a>
+ for details on this behavior.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Example:</strong></span>
+<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">a</span> <span class="special">=</span> <span class="number">1</span> <span class="special">;</span>
+<span class="keyword">int</span> <span class="identifier">b</span> <span class="special">=</span> <span class="number">2</span> <span class="special">;</span>
+<span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">ra</span> <span class="special">=</span> <span class="identifier">a</span> <span class="special">;</span>
+<span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">rb</span> <span class="special">=</span> <span class="identifier">b</span> <span class="special">;</span>
+<span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&amp;&gt;</span> <span class="identifier">def</span> <span class="special">;</span>
+<span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&amp;&gt;</span> <span class="identifier">opt</span><span class="special">(</span><span class="identifier">ra</span><span class="special">)</span> <span class="special">;</span>
+
+<span class="identifier">def</span> <span class="special">=</span> <span class="identifier">rb</span> <span class="special">;</span> <span class="comment">// binds 'def' to 'b' through 'rb'</span>
+<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">def</span> <span class="special">==</span> <span class="identifier">b</span> <span class="special">)</span> <span class="special">;</span>
+<span class="special">*</span><span class="identifier">def</span> <span class="special">=</span> <span class="identifier">a</span> <span class="special">;</span> <span class="comment">// changes the value of 'b' to a copy of the value of 'a'</span>
+<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">b</span> <span class="special">==</span> <span class="identifier">a</span> <span class="special">)</span> <span class="special">;</span>
+<span class="keyword">int</span> <span class="identifier">c</span> <span class="special">=</span> <span class="number">3</span><span class="special">;</span>
+<span class="keyword">int</span><span class="special">&amp;</span> <span class="identifier">rc</span> <span class="special">=</span> <span class="identifier">c</span> <span class="special">;</span>
+<span class="identifier">opt</span> <span class="special">=</span> <span class="identifier">rc</span> <span class="special">;</span> <span class="comment">// REBINDS to 'c' through 'rc'</span>
+<span class="identifier">c</span> <span class="special">=</span> <span class="number">4</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="number">4</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>
+<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">&amp;</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">T</span><span class="special">&amp;&amp;</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">&amp;&amp;</span> <span class="special">)</span></code>
+ or <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span><span class="identifier">T</span> <span class="special">&amp;&amp;)</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">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">def</span> <span class="special">;</span>
+<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="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">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;&amp;</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">T</span><span class="special">&amp;&amp;</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>
+ <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
+ </p>
+<a name="reference_optional_operator_equal_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="identifier">optional</span><span class="special">&amp;</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">optional</span>
+ <span class="keyword">const</span><span class="special">&amp;</span>
+ <span class="identifier">rhs</span> <span class="special">)</span>
+ <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">T</span></code>
+ is <a href="../../../../../../utility/CopyConstructible.html" target="_top"><code class="computeroutput"><span class="identifier">CopyConstructible</span></code></a> and <code class="computeroutput"><span class="identifier">CopyAssignable</span></code>.
+ </li>
+<li class="listitem">
+<p class="simpara">
+ <span class="bold"><strong>Effects:</strong></span>
+ </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+<col>
+</colgroup>
+<thead><tr>
+<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>
+<tr>
+<td>
+ <p>
+ <code class="computeroutput"><span class="identifier">rhs</span></code> contains
+ a value
+ </p>
+ </td>
+<td>
+ <p>
+ assigns <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code>
+ to the contained value
+ </p>
+ </td>
+<td>
+ <p>
+ initializes the contained value as if direct-initializing
+ an object of type <code class="computeroutput"><span class="identifier">T</span></code>
+ with <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code>
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <code class="computeroutput"><span class="identifier">rhs</span></code> does
+ not contain a value
+ </p>
+ </td>
+<td>
+ <p>
+ destroys the contained value by calling <code class="computeroutput"><span class="identifier">val</span><span class="special">-&gt;</span><span class="identifier">T</span><span class="special">::~</span><span class="identifier">T</span><span class="special">()</span></code>
+ </p>
+ </td>
+<td>
+ <p>
+ no effect
+ </p>
+ </td>
+</tr>
+</tbody>
+</table></div>
+</li>
+<li class="listitem">
+ <span class="bold"><strong>Returns:</strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>;
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Postconditions:</strong></span> <code class="computeroutput"><span class="keyword">bool</span><span class="special">(</span><span class="identifier">rhs</span><span class="special">)</span> <span class="special">==</span> <span class="keyword">bool</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span></code>.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Exception Safety:</strong></span> If any exception
+ is thrown, the initialization state of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> and <code class="computeroutput"><span class="identifier">rhs</span></code>
+ remains unchanged. If an exception is thrown during the call to <code class="computeroutput"><span class="identifier">T</span></code>'s copy constructor, no effect.
+ If an exception is thrown during the call to <code class="computeroutput"><span class="identifier">T</span></code>'s
+ copy assignment, the state of its contained value is as defined by
+ the exception safety guarantee of <code class="computeroutput"><span class="identifier">T</span></code>'s
+ copy assignment.
+ </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">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">opt</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span>
+<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">def</span> <span class="special">;</span>
+
+<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="special">!</span><span class="identifier">def</span> <span class="special">)</span> <span class="special">;</span>
+<span class="comment">// previous value (copy of 'v') destroyed from within 'opt'.</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">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span>
+ <span class="special">&amp;</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span> <span class="keyword">const</span><span class="special">&amp;</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> (Re)binds thee wrapped reference.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Postconditions:</strong></span> If <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code> is initialized, <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
+ is initialized and it references the same object referenced by <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code>;
+ otherwise, <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
+ is uninitialized (and references no object).
+ </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 and so is <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code>,
+ <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
+ is <span class="emphasis"><em>rebound</em></span> to the new object. See <a class="link" href="../../tutorial/rebinding_semantics_for_assignment_of_optional_references.html" title="Rebinding semantics for assignment of optional references">here</a>
+ for details on this behavior.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Example:</strong></span>
+<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">a</span> <span class="special">=</span> <span class="number">1</span> <span class="special">;</span>
+<span class="keyword">int</span> <span class="identifier">b</span> <span class="special">=</span> <span class="number">2</span> <span class="special">;</span>
+<span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">ra</span> <span class="special">=</span> <span class="identifier">a</span> <span class="special">;</span>
+<span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">rb</span> <span class="special">=</span> <span class="identifier">b</span> <span class="special">;</span>
+<span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&amp;&gt;</span> <span class="identifier">def</span> <span class="special">;</span>
+<span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&amp;&gt;</span> <span class="identifier">ora</span><span class="special">(</span><span class="identifier">ra</span><span class="special">)</span> <span class="special">;</span>
+<span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&amp;&gt;</span> <span class="identifier">orb</span><span class="special">(</span><span class="identifier">rb</span><span class="special">)</span> <span class="special">;</span>
+
+<span class="identifier">def</span> <span class="special">=</span> <span class="identifier">orb</span> <span class="special">;</span> <span class="comment">// binds 'def' to 'b' through 'rb' wrapped within 'orb'</span>
+<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">def</span> <span class="special">==</span> <span class="identifier">b</span> <span class="special">)</span> <span class="special">;</span>
+<span class="special">*</span><span class="identifier">def</span> <span class="special">=</span> <span class="identifier">ora</span> <span class="special">;</span> <span class="comment">// changes the value of 'b' to a copy of the value of 'a'</span>
+<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">b</span> <span class="special">==</span> <span class="identifier">a</span> <span class="special">)</span> <span class="special">;</span>
+<span class="keyword">int</span> <span class="identifier">c</span> <span class="special">=</span> <span class="number">3</span><span class="special">;</span>
+<span class="keyword">int</span><span class="special">&amp;</span> <span class="identifier">rc</span> <span class="special">=</span> <span class="identifier">c</span> <span class="special">;</span>
+<span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&amp;&gt;</span> <span class="identifier">orc</span><span class="special">(</span><span class="identifier">rc</span><span class="special">)</span> <span class="special">;</span>
+<span class="identifier">ora</span> <span class="special">=</span> <span class="identifier">orc</span> <span class="special">;</span> <span class="comment">// REBINDS ora to 'c' through 'rc'</span>
+<span class="identifier">c</span> <span class="special">=</span> <span class="number">4</span> <span class="special">;</span>
+<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">ora</span> <span class="special">==</span> <span class="number">4</span> <span class="special">)</span> <span class="special">;</span>
+</pre>
+ </li>
+</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">&amp;</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&amp;&amp;</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">T</span></code>
+ is <code class="computeroutput"><span class="identifier">MoveConstructible</span></code>
+ and <code class="computeroutput"><span class="identifier">MoveAssignable</span></code>.
+ </li>
+<li class="listitem">
+<p class="simpara">
+ <span class="bold"><strong>Effects:</strong></span>
+ </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+<col>
+</colgroup>
+<thead><tr>
+<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>
+<tr>
+<td>
+ <p>
+ <code class="computeroutput"><span class="identifier">rhs</span></code> contains
+ a value
+ </p>
+ </td>
+<td>
+ <p>
+ assigns <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(*</span><span class="identifier">rhs</span><span class="special">)</span></code> to the contained value
+ </p>
+ </td>
+<td>
+ <p>
+ initializes the contained value as if direct-initializing
+ an object of type <code class="computeroutput"><span class="identifier">T</span></code>
+ with <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(*</span><span class="identifier">rhs</span><span class="special">)</span></code>
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <code class="computeroutput"><span class="identifier">rhs</span></code> does
+ not contain a value
+ </p>
+ </td>
+<td>
+ <p>
+ destroys the contained value by calling <code class="computeroutput"><span class="identifier">val</span><span class="special">-&gt;</span><span class="identifier">T</span><span class="special">::~</span><span class="identifier">T</span><span class="special">()</span></code>
+ </p>
+ </td>
+<td>
+ <p>
+ no effect
+ </p>
+ </td>
+</tr>
+</tbody>
+</table></div>
+</li>
+<li class="listitem">
+ <span class="bold"><strong>Returns:</strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>;
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Postconditions:</strong></span> <code class="computeroutput"><span class="keyword">bool</span><span class="special">(</span><span class="identifier">rhs</span><span class="special">)</span> <span class="special">==</span> <span class="keyword">bool</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span></code>.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Remarks:</strong></span> 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">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span> <span class="special">&amp;&amp;</span>
+ <span class="identifier">is_nothrow_move_assignable</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span></code>.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Exception Safety:</strong></span> If any exception
+ is thrown, the initialization state of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> and <code class="computeroutput"><span class="identifier">rhs</span></code>
+ remains unchanged. If an exception is thrown during the call to <code class="computeroutput"><span class="identifier">T</span></code>'s move constructor, the state of
+ <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code>
+ is determined by the exception safety guarantee of <code class="computeroutput"><span class="identifier">T</span></code>'s
+ move constructor. If an exception is thrown during the call to T's
+ move-assignment, the state of <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> is determined by the exception
+ safety guarantee of T's move assignment.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Example:</strong></span>
+<pre class="programlisting"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">opt</span><span class="special">(</span><span class="identifier">T</span><span class="special">(</span><span class="number">2</span><span class="special">))</span> <span class="special">;</span>
+<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">def</span> <span class="special">;</span>
+
+<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">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span>
+ <span class="special">&amp;</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;&amp;&amp;</span> <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">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span>
+ <span class="keyword">const</span><span class="special">&amp;</span>
+ <span class="identifier">rhs</span> <span class="special">)</span></code>.
+ </li></ul></div>
+<p>
+ <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
+ </p>
+<a name="reference_optional_operator_equal_other_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;</span> <span class="identifier">optional</span><span class="special">&amp;</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</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">
+<p class="simpara">
+ <span class="bold"><strong>Effect:</strong></span>
+ </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+<col>
+</colgroup>
+<thead><tr>
+<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>
+<tr>
+<td>
+ <p>
+ <code class="computeroutput"><span class="identifier">rhs</span></code> contains
+ a value
+ </p>
+ </td>
+<td>
+ <p>
+ assigns <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code>
+ to the contained value
+ </p>
+ </td>
+<td>
+ <p>
+ initializes the contained value as if direct-initializing
+ an object of type <code class="computeroutput"><span class="identifier">T</span></code>
+ with <code class="computeroutput"><span class="special">*</span><span class="identifier">rhs</span></code>
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <code class="computeroutput"><span class="identifier">rhs</span></code> does
+ not contain a value
+ </p>
+ </td>
+<td>
+ <p>
+ destroys the contained value by calling <code class="computeroutput"><span class="identifier">val</span><span class="special">-&gt;</span><span class="identifier">T</span><span class="special">::~</span><span class="identifier">T</span><span class="special">()</span></code>
+ </p>
+ </td>
+<td>
+ <p>
+ no effect
+ </p>
+ </td>
+</tr>
+</tbody>
+</table></div>
+</li>
+<li class="listitem">
+ <span class="bold"><strong>Returns:</strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Postconditions:</strong></span> <code class="computeroutput"><span class="keyword">bool</span><span class="special">(</span><span class="identifier">rhs</span><span class="special">)</span> <span class="special">==</span> <span class="keyword">bool</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span></code>.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Exception Safety:</strong></span> If any exception
+ is thrown, the result of the expression <code class="computeroutput"><span class="keyword">bool</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span></code> remains unchanged. If an exception
+ is thrown during the call to <code class="computeroutput"><span class="identifier">T</span></code>'s
+ constructor, no effect. If an exception is thrown during the call to
+ <code class="computeroutput"><span class="identifier">T</span></code>'s assignment, the
+ state of its contained value is as defined by the exception safety
+ guarantee of <code class="computeroutput"><span class="identifier">T</span></code>'s copy
+ assignment.
+ </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">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">opt0</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span>
+<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;</span> <span class="identifier">opt1</span><span class="special">;</span>
+
+<span class="identifier">opt1</span> <span class="special">=</span> <span class="identifier">opt0</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">&lt;</span><span class="identifier">U</span><span class="special">&gt;(</span><span class="identifier">v</span><span class="special">)</span> <span class="special">)</span> <span class="special">;</span>
+</pre>
+ </li>
+</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">&lt;</span><span class="identifier">U</span><span class="special">&gt;</span> <span class="identifier">optional</span><span class="special">&amp;</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;&amp;&amp;</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">
+<p class="simpara">
+ <span class="bold"><strong>Effect:</strong></span>
+ </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+<col>
+</colgroup>
+<thead><tr>
+<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>
+<tr>
+<td>
+ <p>
+ <code class="computeroutput"><span class="identifier">rhs</span></code> contains
+ a value
+ </p>
+ </td>
+<td>
+ <p>
+ assigns <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(*</span><span class="identifier">rhs</span><span class="special">)</span></code> to the contained value
+ </p>
+ </td>
+<td>
+ <p>
+ initializes the contained value as if direct-initializing
+ an object of type <code class="computeroutput"><span class="identifier">T</span></code>
+ with <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(*</span><span class="identifier">rhs</span><span class="special">)</span></code>
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <code class="computeroutput"><span class="identifier">rhs</span></code> does
+ not contain a value
+ </p>
+ </td>
+<td>
+ <p>
+ destroys the contained value by calling <code class="computeroutput"><span class="identifier">val</span><span class="special">-&gt;</span><span class="identifier">T</span><span class="special">::~</span><span class="identifier">T</span><span class="special">()</span></code>
+ </p>
+ </td>
+<td>
+ <p>
+ no effect
+ </p>
+ </td>
+</tr>
+</tbody>
+</table></div>
+</li>
+<li class="listitem">
+ <span class="bold"><strong>Returns:</strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Postconditions:</strong></span> <code class="computeroutput"><span class="keyword">bool</span><span class="special">(</span><span class="identifier">rhs</span><span class="special">)</span> <span class="special">==</span> <span class="keyword">bool</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span></code>.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Exception Safety:</strong></span> If any exception
+ is thrown, the result of the expression <code class="computeroutput"><span class="keyword">bool</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span></code> remains unchanged. If an exception
+ is thrown during the call to <code class="computeroutput"><span class="identifier">T</span></code>'s
+ constructor, no effect. If an exception is thrown during the call to
+ <code class="computeroutput"><span class="identifier">T</span></code>'s assignment, the
+ state of its contained value is as defined by the exception safety
+ guarantee of <code class="computeroutput"><span class="identifier">T</span></code>'s copy
+ assignment.
+ </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">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">opt0</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span>
+<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;</span> <span class="identifier">opt1</span><span class="special">;</span>
+
+<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="identifier">opt0</span> <span class="special">);</span>
+<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">opt1</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">&lt;</span><span class="identifier">U</span><span class="special">&gt;(</span><span class="identifier">v</span><span class="special">)</span> <span class="special">)</span> <span class="special">;</span>
+</pre>
+ </li>
+</ul></div>
+<p>
+ <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
+ </p>
+<a name="reference_optional_emplace"></a><div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span><span class="special">...</span> <span class="identifier">Args</span><span class="special">&gt;</span>
+ <span class="keyword">void</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
+ <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">emplace</span><span class="special">(</span>
+ <span class="identifier">Args</span><span class="special">...&amp;&amp;</span>
+ <span class="identifier">args</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> The compiler supports rvalue
+ references and variadic templates.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Effect:</strong></span> If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is initialized calls <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span> <span class="special">=</span> <span class="identifier">none</span></code>.
+ Then initializes in-place the contained value as if direct-initializing
+ an object of type <code class="computeroutput"><span class="identifier">T</span></code>
+ with <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">Args</span><span class="special">&gt;(</span><span class="identifier">args</span><span class="special">)...</span></code>.
+ </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>.
+ </li>
+<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.
+ </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">
+ <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>,
+ <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
+ is <span class="emphasis"><em>uninitialized</em></span>.
+ </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">&lt;</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">opt</span><span class="special">;</span>
+<span class="identifier">opt</span><span class="special">.</span><span class="identifier">emplace</span><span class="special">(</span><span class="number">0</span><span class="special">);</span> <span class="comment">// create in-place using ctor T(int)</span>
+<span class="identifier">opt</span><span class="special">.</span><span class="identifier">emplace</span><span class="special">();</span> <span class="comment">// destroy previous and default-construct another T</span>
+<span class="identifier">opt</span><span class="special">.</span><span class="identifier">emplace</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span> <span class="comment">// destroy and copy-construct in-place (no assignment called)</span>
+</pre>
+ </li>
+</ul></div>
+<p>
+ <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
+ </p>
+<a name="reference_optional_operator_equal_factory"></a><div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="identifier">InPlaceFactory</span><span class="special">&gt;</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&amp;</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">InPlaceFactory</span>
+ <span class="keyword">const</span><span class="special">&amp;</span>
+ <span class="identifier">f</span> <span class="special">);</span></code>
+ </p></blockquote></div>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="identifier">TypedInPlaceFactory</span><span class="special">&gt;</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&amp;</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">TypedInPlaceFactory</span>
+ <span class="keyword">const</span><span class="special">&amp;</span>
+ <span class="identifier">f</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> Assigns an <code class="computeroutput"><span class="identifier">optional</span></code>
+ with a value of <code class="computeroutput"><span class="identifier">T</span></code> obtained
+ from the factory.
+ </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 <span class="emphasis"><em>directly given</em></span> from the factory
+ <code class="computeroutput"><span class="identifier">f</span></code> (i.e., the value
+ <span class="underline">is not copied</span>).
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Throws:</strong></span> Whatever the <code class="computeroutput"><span class="identifier">T</span></code> constructor called by the factory
+ throws.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Notes:</strong></span> See <a class="link" href="../../tutorial/in_place_factories.html" title="In-Place Factories">In-Place
+ Factories</a>
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Exception Safety:</strong></span> Exceptions can only
+ be thrown during the call to the <code class="computeroutput"><span class="identifier">T</span></code>
+ constructor used by the factory; in that case, the <code class="computeroutput"><span class="identifier">optional</span></code>
+ object will be reset to be <span class="emphasis"><em>uninitialized</em></span>.
+ </li>
+</ul></div>
+<p>
+ <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
+ </p>
+<a name="reference_optional_reset_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="keyword">void</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
+ <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">reset</span><span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span></code>
+ </p></blockquote></div>
+<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
+ <span class="bold"><strong>Deprecated:</strong></span> same as <code class="computeroutput"><span class="keyword">operator</span><span class="special">=</span>
+ <span class="special">(</span> <span class="identifier">T</span>
+ <span class="keyword">const</span><span class="special">&amp;</span>
+ <span class="identifier">v</span><span class="special">)</span>
+ <span class="special">;</span></code>
+ </li></ul></div>
+<p>
+ <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
+ </p>
+<a name="reference_optional_reset"></a><div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="keyword">void</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">reset</span><span class="special">()</span> <span class="keyword">noexcept</span>
+ <span class="special">;</span></code>
+ </p></blockquote></div>
+<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
+ <span class="bold"><strong>Deprecated:</strong></span> Same as <code class="computeroutput"><span class="keyword">operator</span><span class="special">=(</span>
+ <span class="identifier">none_t</span> <span class="special">);</span></code>
+ </li></ul></div>
+<p>
+ <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
+ </p>
+<a name="reference_optional_get"></a><div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
+ <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">get</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">;</span></code>
+ </p></blockquote></div>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="identifier">T</span><span class="special">&amp;</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">get</span><span class="special">()</span> <span class="special">;</span></code>
+ </p></blockquote></div>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="keyword">inline</span> <span class="identifier">T</span>
+ <span class="keyword">const</span><span class="special">&amp;</span>
+ <span class="identifier">get</span> <span class="special">(</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">)</span> <span class="special">;</span></code>
+ </p></blockquote></div>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="keyword">inline</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">get</span>
+ <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
+ <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;</span>
+ <span class="special">&amp;)</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="special">*</span><span class="keyword">this</span></code> is initialized
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Returns:</strong></span> A reference to the contained
+ value
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Throws:</strong></span> Nothing.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Notes:</strong></span> The requirement is asserted
+ via <code class="computeroutput"><span class="identifier">BOOST_ASSERT</span><span class="special">()</span></code>.
+ </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">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;::</span><span class="identifier">get</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">;</span></code>
+ </p></blockquote></div>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="identifier">T</span><span class="special">&amp;</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;::</span><span class="identifier">get</span><span class="special">()</span> <span class="special">;</span></code>
+ </p></blockquote></div>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="keyword">inline</span> <span class="identifier">T</span>
+ <span class="keyword">const</span><span class="special">&amp;</span>
+ <span class="identifier">get</span> <span class="special">(</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span>
+ <span class="keyword">const</span><span class="special">&amp;</span>
+ <span class="special">)</span> <span class="special">;</span></code>
+ </p></blockquote></div>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="keyword">inline</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">get</span>
+ <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span> <span class="special">&amp;)</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="special">*</span><span class="keyword">this</span></code> is initialized
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Returns:</strong></span> <span class="underline">The</span>
+ reference contained.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Throws:</strong></span> Nothing.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Notes:</strong></span> The requirement is asserted
+ via <code class="computeroutput"><span class="identifier">BOOST_ASSERT</span><span class="special">()</span></code>.
+ </li>
+</ul></div>
+<p>
+ <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
+ </p>
+<a name="reference_optional_operator_asterisk"></a><div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
+ <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">*()</span>
+ <span class="keyword">const</span><span class="special">&amp;</span>
+ <span class="special">;</span></code>
+ </p></blockquote></div>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="identifier">T</span><span class="special">&amp;</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">*()</span> <span class="special">&amp;;</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="special">*</span><span class="keyword">this</span></code> is initialized
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Returns:</strong></span> A reference to the contained
+ value
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Throws:</strong></span> Nothing.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Notes:</strong></span> The requirement is asserted
+ via <code class="computeroutput"><span class="identifier">BOOST_ASSERT</span><span class="special">()</span></code>.
+ On compilers that do not support ref-qualifiers on member functions
+ these two overloads are replaced with the classical two: a <code class="computeroutput"><span class="keyword">const</span></code> and non-<code class="computeroutput"><span class="keyword">const</span></code>
+ member functions.
+ </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">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">opt</span> <span class="special">(</span> <span class="identifier">v</span> <span class="special">);</span>
+<span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">u</span> <span class="special">=</span> <span class="special">*</span><span class="identifier">opt</span><span class="special">;</span>
+<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">u</span> <span class="special">==</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span>
+<span class="identifier">T</span> <span class="identifier">w</span> <span class="special">;</span>
+<span class="special">*</span><span class="identifier">opt</span> <span class="special">=</span> <span class="identifier">w</span> <span class="special">;</span>
+<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">opt</span> <span class="special">==</span> <span class="identifier">w</span> <span class="special">)</span> <span class="special">;</span>
+</pre>
+ </li>
+</ul></div>
+<p>
+ <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
+ </p>
+<a name="reference_optional_operator_asterisk_move"></a><div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="identifier">T</span><span class="special">&amp;&amp;</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">*()</span> <span class="special">&amp;&amp;;</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="special">*</span><span class="keyword">this</span></code> contains a value.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Effects:</strong></span> Equivalent to <code class="computeroutput"><span class="keyword">return</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(*</span><span class="identifier">val</span><span class="special">);</span></code>.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Notes:</strong></span> The requirement is asserted
+ via <code class="computeroutput"><span class="identifier">BOOST_ASSERT</span><span class="special">()</span></code>.
+ On compilers that do not support ref-qualifiers on member functions
+ this overload is not present.
+ </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">T</span> <span class="special">&amp;</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;::</span><span class="keyword">operator</span><span class="special">*()</span>
+ <span class="keyword">const</span><span class="special">&amp;</span>
+ <span class="special">;</span></code>
+ </p></blockquote></div>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="identifier">T</span> <span class="special">&amp;</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;::</span><span class="keyword">operator</span><span class="special">*()</span>
+ <span class="special">&amp;</span> <span class="special">;</span></code>
+ </p></blockquote></div>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="identifier">T</span> <span class="special">&amp;</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;::</span><span class="keyword">operator</span><span class="special">*()</span>
+ <span class="special">&amp;&amp;</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="special">*</span><span class="keyword">this</span></code> is initialized
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Returns:</strong></span> <span class="underline">The</span>
+ reference contained.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Throws:</strong></span> Nothing.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Notes:</strong></span> The requirement is asserted
+ via <code class="computeroutput"><span class="identifier">BOOST_ASSERT</span><span class="special">()</span></code>.
+ On compilers that do not support ref-qualifiers on member functions
+ these three overloads are replaced with the classical two: a <code class="computeroutput"><span class="keyword">const</span></code> and non-<code class="computeroutput"><span class="keyword">const</span></code>
+ member functions.
+ </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">T</span><span class="special">&amp;</span> <span class="identifier">vref</span> <span class="special">=</span> <span class="identifier">v</span> <span class="special">;</span>
+<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span> <span class="identifier">opt</span> <span class="special">(</span> <span class="identifier">vref</span> <span class="special">);</span>
+<span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">vref2</span> <span class="special">=</span> <span class="special">*</span><span class="identifier">opt</span><span class="special">;</span>
+<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">vref2</span> <span class="special">==</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span>
+<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">opt</span> <span class="special">==</span> <span class="identifier">v</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>
+<a name="reference_optional_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">()</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">;</span></code>
+ </p></blockquote></div>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="identifier">T</span><span class="special">&amp;</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">()</span> <span class="special">&amp;</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>Effects:</strong></span> Equivalent to <code class="computeroutput"><span class="keyword">return</span> <span class="keyword">bool</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span> <span class="special">?</span> <span class="special">*</span><span class="identifier">val</span> <span class="special">:</span> <span class="keyword">throw</span> <span class="identifier">bad_optional_access</span><span class="special">();</span></code>.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Notes:</strong></span> On compilers that do not support
+ ref-qualifiers on member functions these two overloads are replaced
+ with the classical two: a <code class="computeroutput"><span class="keyword">const</span></code>
+ and non-<code class="computeroutput"><span class="keyword">const</span></code> member functions.
+ </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">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">o0</span><span class="special">,</span> <span class="identifier">o1</span> <span class="special">(</span> <span class="identifier">v</span> <span class="special">);</span>
+<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">o1</span><span class="special">.</span><span class="identifier">value</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">v</span> <span class="special">);</span>
+
+<span class="keyword">try</span> <span class="special">{</span>
+ <span class="identifier">o0</span><span class="special">.</span><span class="identifier">value</span><span class="special">();</span> <span class="comment">// throws</span>
+ <span class="identifier">assert</span> <span class="special">(</span> <span class="keyword">false</span> <span class="special">);</span>
+<span class="special">}</span>
+<span class="keyword">catch</span><span class="special">(</span><span class="identifier">bad_optional_access</span><span class="special">&amp;)</span> <span class="special">{</span>
+ <span class="identifier">assert</span> <span class="special">(</span> <span class="keyword">true</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>
+<a name="reference_optional_value_move"></a><div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="identifier">T</span><span class="special">&amp;&amp;</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">()</span> <span class="special">&amp;&amp;</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>Effects:</strong></span> Equivalent to <code class="computeroutput"><span class="keyword">return</span> <span class="keyword">bool</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</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">val</span><span class="special">)</span> <span class="special">:</span> <span class="keyword">throw</span> <span class="identifier">bad_optional_access</span><span class="special">();</span></code>.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Notes:</strong></span> On compilers that do not support
+ ref-qualifiers on member functions this overload is not present.
+ </li>
+</ul></div>
+<p>
+ <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
+ </p>
+<a name="reference_optional_value_or"></a><div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">&gt;</span> <span class="identifier">T</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value_or</span><span class="special">(</span><span class="identifier">U</span> <span class="special">&amp;&amp;</span>
+ <span class="identifier">v</span><span class="special">)</span>
+ <span class="keyword">const</span><span class="special">&amp;</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>Effects:</strong></span> Equivalent to <code class="computeroutput"><span class="keyword">if</span> <span class="special">(*</span><span class="keyword">this</span><span class="special">)</span> <span class="keyword">return</span> <span class="special">**</span><span class="keyword">this</span><span class="special">;</span> <span class="keyword">else</span> <span class="keyword">return</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;(</span><span class="identifier">v</span><span class="special">);</span></code>.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Remarks:</strong></span> If <code class="computeroutput"><span class="identifier">T</span></code>
+ is not <a href="../../../../../../utility/CopyConstructible.html" target="_top"><code class="computeroutput"><span class="identifier">CopyConstructible</span></code></a> or <code class="computeroutput"><span class="identifier">U</span> <span class="special">&amp;&amp;</span></code>
+ is not convertible to <code class="computeroutput"><span class="identifier">T</span></code>,
+ the program is ill-formed.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Notes:</strong></span> On compilers that do not support
+ ref-qualifiers on member functions this overload is replaced with the
+ <code class="computeroutput"><span class="keyword">const</span></code>-qualified member
+ function. On compilers without rvalue reference support the type of
+ <code class="computeroutput"><span class="identifier">v</span></code> becomes <code class="computeroutput"><span class="identifier">U</span> <span class="keyword">const</span><span class="special">&amp;</span></code>.
+ </li>
+</ul></div>
+<p>
+ <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
+ </p>
+<a name="reference_optional_value_or_move"></a><div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">&gt;</span> <span class="identifier">T</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value_or</span><span class="special">(</span><span class="identifier">U</span> <span class="special">&amp;&amp;</span>
+ <span class="identifier">v</span><span class="special">)</span>
+ <span class="special">&amp;&amp;</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>Effects:</strong></span> Equivalent to <code class="computeroutput"><span class="keyword">if</span> <span class="special">(*</span><span class="keyword">this</span><span class="special">)</span> <span class="keyword">return</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(**</span><span class="keyword">this</span><span class="special">);</span> <span class="keyword">else</span> <span class="keyword">return</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;(</span><span class="identifier">v</span><span class="special">);</span></code>.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Remarks:</strong></span> If <code class="computeroutput"><span class="identifier">T</span></code>
+ is not <code class="computeroutput"><span class="identifier">MoveConstructible</span></code>
+ or <code class="computeroutput"><span class="identifier">U</span> <span class="special">&amp;&amp;</span></code>
+ is not convertible to <code class="computeroutput"><span class="identifier">T</span></code>,
+ the program is ill-formed.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Notes:</strong></span> On compilers that do not support
+ ref-qualifiers on member functions this overload is not present.
+ </li>
+</ul></div>
+<p>
+ <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
+ </p>
+<a name="reference_optional_value_or_call"></a><div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">&gt;</span> <span class="identifier">T</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value_or_eval</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">)</span> <span class="keyword">const</span><span class="special">&amp;</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">T</span></code>
+ is <a href="../../../../../../utility/CopyConstructible.html" target="_top"><code class="computeroutput"><span class="identifier">CopyConstructible</span></code></a> and <code class="computeroutput"><span class="identifier">F</span></code> models a <a href="http://www.sgi.com/tech/stl/Generator.html" target="_top"><code class="computeroutput"><span class="identifier">Generator</span></code></a> whose result type
+ is convertible to <code class="computeroutput"><span class="identifier">T</span></code>.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Effects:</strong></span> <code class="computeroutput"><span class="keyword">if</span>
+ <span class="special">(*</span><span class="keyword">this</span><span class="special">)</span> <span class="keyword">return</span> <span class="special">**</span><span class="keyword">this</span><span class="special">;</span> <span class="keyword">else</span> <span class="keyword">return</span> <span class="identifier">f</span><span class="special">();</span></code>.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Notes:</strong></span> On compilers that do not support
+ ref-qualifiers on member functions this overload is replaced with the
+ <code class="computeroutput"><span class="keyword">const</span></code>-qualified member
+ function.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Example:</strong></span>
+<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">complain_and_0</span><span class="special">()</span>
+<span class="special">{</span>
+ <span class="identifier">clog</span> <span class="special">&lt;&lt;</span> <span class="string">"no value returned, using default"</span> <span class="special">&lt;&lt;</span> <span class="identifier">endl</span><span class="special">;</span>
+ <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
+<span class="special">}</span>
+
+<span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">o1</span> <span class="special">=</span> <span class="number">1</span><span class="special">;</span>
+<span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">oN</span> <span class="special">=</span> <span class="identifier">none</span><span class="special">;</span>
+
+<span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">o1</span><span class="special">.</span><span class="identifier">value_or_eval</span><span class="special">(</span><span class="identifier">complain_and_0</span><span class="special">);</span> <span class="comment">// fun not called</span>
+<span class="identifier">assert</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="keyword">int</span> <span class="identifier">j</span> <span class="special">=</span> <span class="identifier">oN</span><span class="special">.</span><span class="identifier">value_or_eval</span><span class="special">(</span><span class="identifier">complain_and_0</span><span class="special">);</span> <span class="comment">// fun called</span>
+<span class="identifier">assert</span> <span class="special">(</span><span class="identifier">i</span> <span class="special">==</span> <span class="number">0</span><span class="special">);</span>
+</pre>
+ </li>
+</ul></div>
+<p>
+ <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
+ </p>
+<a name="reference_optional_value_or_call_move"></a><div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">&gt;</span> <span class="identifier">T</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value_or_eval</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">)</span> <span class="special">&amp;&amp;</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">T</span></code>
+ is <code class="computeroutput"><span class="identifier">MoveConstructible</span></code>
+ and <code class="computeroutput"><span class="identifier">F</span></code> models a <a href="http://www.sgi.com/tech/stl/Generator.html" target="_top"><code class="computeroutput"><span class="identifier">Generator</span></code></a>
+ whose result type is convertible to <code class="computeroutput"><span class="identifier">T</span></code>.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Effects:</strong></span> <code class="computeroutput"><span class="keyword">if</span>
+ <span class="special">(*</span><span class="keyword">this</span><span class="special">)</span> <span class="keyword">return</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(**</span><span class="keyword">this</span><span class="special">);</span> <span class="keyword">else</span> <span class="keyword">return</span>
+ <span class="identifier">f</span><span class="special">();</span></code>.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Notes:</strong></span> On compilers that do not support
+ ref-qualifiers on member functions this overload is not present.
+ </li>
+</ul></div>
+<p>
+ <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
+ </p>
+<a name="reference_optional_get_value_or_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
+ <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">get_value_or</span><span class="special">(</span>
+ <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="keyword">default</span><span class="special">)</span> <span class="keyword">const</span> <span class="special">;</span></code>
+ </p></blockquote></div>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="identifier">T</span><span class="special">&amp;</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">get_value_or</span><span class="special">(</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="keyword">default</span>
+ <span class="special">)</span> <span class="special">;</span></code>
+ </p></blockquote></div>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="keyword">inline</span> <span class="identifier">T</span>
+ <span class="keyword">const</span><span class="special">&amp;</span>
+ <span class="identifier">get_optional_value_or</span> <span class="special">(</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">o</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="keyword">default</span> <span class="special">)</span> <span class="special">;</span></code>
+ </p></blockquote></div>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="keyword">inline</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">get_optional_value_or</span>
+ <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
+ <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;&amp;</span>
+ <span class="identifier">o</span><span class="special">,</span>
+ <span class="identifier">T</span><span class="special">&amp;</span>
+ <span class="keyword">default</span> <span class="special">)</span>
+ <span class="special">;</span></code>
+ </p></blockquote></div>
+<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
+<li class="listitem">
+ <span class="bold"><strong>Deprecated:</strong></span> Use <code class="computeroutput"><span class="identifier">value_or</span><span class="special">()</span></code> instead.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Returns:</strong></span> A reference to the contained
+ value, if any, or <code class="computeroutput"><span class="keyword">default</span></code>.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Throws:</strong></span> Nothing.
+ </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">z</span> <span class="special">;</span>
+<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">def</span><span class="special">;</span>
+<span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">y</span> <span class="special">=</span> <span class="identifier">def</span><span class="special">.</span><span class="identifier">get_value_or</span><span class="special">(</span><span class="identifier">z</span><span class="special">);</span>
+<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">y</span> <span class="special">==</span> <span class="identifier">z</span> <span class="special">)</span> <span class="special">;</span>
+
+<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">opt</span> <span class="special">(</span> <span class="identifier">v</span> <span class="special">);</span>
+<span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">u</span> <span class="special">=</span> <span class="identifier">get_optional_value_or</span><span class="special">(</span><span class="identifier">opt</span><span class="special">,</span><span class="identifier">z</span><span class="special">);</span>
+<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">u</span> <span class="special">==</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span>
+<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">u</span> <span class="special">!=</span> <span class="identifier">z</span> <span class="special">)</span> <span class="special">;</span>
+</pre>
+ </li>
+</ul></div>
+<p>
+ <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
+ </p>
+<a name="reference_optional_get_ptr"></a><div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="identifier">T</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
+ <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">get_ptr</span><span class="special">()</span>
+ <span class="keyword">const</span> <span class="special">;</span></code>
+ </p></blockquote></div>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="identifier">T</span><span class="special">*</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="identifier">get_ptr</span><span class="special">()</span> <span class="special">;</span></code>
+ </p></blockquote></div>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="keyword">inline</span> <span class="identifier">T</span>
+ <span class="keyword">const</span><span class="special">*</span>
+ <span class="identifier">get_pointer</span> <span class="special">(</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">)</span> <span class="special">;</span></code>
+ </p></blockquote></div>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="keyword">inline</span> <span class="identifier">T</span><span class="special">*</span> <span class="identifier">get_pointer</span>
+ <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
+ <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;</span>
+ <span class="special">&amp;)</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>Returns:</strong></span> If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is initialized, a pointer to the
+ contained value; else <code class="computeroutput"><span class="number">0</span></code>
+ (<span class="emphasis"><em>null</em></span>).
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Throws:</strong></span> Nothing.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Notes:</strong></span> The contained value is permanently
+ stored within <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
+ so you should not hold nor delete this pointer
+ </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">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">opt</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span>
+<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span> <span class="identifier">copt</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span>
+<span class="identifier">T</span><span class="special">*</span> <span class="identifier">p</span> <span class="special">=</span> <span class="identifier">opt</span><span class="special">.</span><span class="identifier">get_ptr</span><span class="special">()</span> <span class="special">;</span>
+<span class="identifier">T</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">cp</span> <span class="special">=</span> <span class="identifier">copt</span><span class="special">.</span><span class="identifier">get_ptr</span><span class="special">();</span>
+<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">p</span> <span class="special">==</span> <span class="identifier">get_pointer</span><span class="special">(</span><span class="identifier">opt</span><span class="special">)</span> <span class="special">);</span>
+<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">cp</span> <span class="special">==</span> <span class="identifier">get_pointer</span><span class="special">(</span><span class="identifier">copt</span><span class="special">)</span> <span class="special">)</span> <span class="special">;</span>
+</pre>
+ </li>
+</ul></div>
+<p>
+ <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
+ </p>
+<a name="reference_optional_operator_arrow"></a><div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="identifier">T</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code>
+ <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="keyword">operator</span> <span class="special">-&gt;()</span>
+ <span class="keyword">const</span> <span class="special">;</span></code>
+ </p></blockquote></div>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="identifier">T</span><span class="special">*</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;::</span><span class="keyword">operator</span>
+ <span class="special">-&gt;()</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="special">*</span><span class="keyword">this</span></code> is initialized.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Returns:</strong></span> A pointer to the contained
+ value.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Throws:</strong></span> Nothing.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Notes:</strong></span> The requirement is asserted
+ via <code class="computeroutput"><span class="identifier">BOOST_ASSERT</span><span class="special">()</span></code>.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Example:</strong></span>
+<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">X</span> <span class="special">{</span> <span class="keyword">int</span> <span class="identifier">mdata</span> <span class="special">;</span> <span class="special">}</span> <span class="special">;</span>
+<span class="identifier">X</span> <span class="identifier">x</span> <span class="special">;</span>
+<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">X</span><span class="special">&gt;</span> <span class="identifier">opt</span> <span class="special">(</span><span class="identifier">x</span><span class="special">);</span>
+<span class="identifier">opt</span><span class="special">-&gt;</span><span class="identifier">mdata</span> <span class="special">=</span> <span class="number">2</span> <span class="special">;</span>
+</pre>
+ </li>
+</ul></div>
+<p>
+ <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
+ </p>
+<a name="reference_optional_operator_bool"></a><div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="keyword">explicit</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="keyword">operator</span>
+ <span class="keyword">bool</span><span class="special">()</span>
+ <span class="keyword">const</span> <span class="keyword">noexcept</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>Returns:</strong></span> <code class="computeroutput"><span class="identifier">get_ptr</span><span class="special">()</span> <span class="special">!=</span> <span class="number">0</span></code>.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Notes:</strong></span> On compilers that do not support
+ explicit conversion operators this falls back to safe-bool idiom.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Example:</strong></span>
+<pre class="programlisting"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">def</span> <span class="special">;</span>
+<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">def</span> <span class="special">==</span> <span class="number">0</span> <span class="special">);</span>
+<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">opt</span> <span class="special">(</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span>
+<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">opt</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="number">0</span> <span class="special">);</span>
+</pre>
+ </li>
+</ul></div>
+<p>
+ <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
+ </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">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="keyword">operator</span><span class="special">!()</span> <span class="keyword">noexcept</span>
+ <span class="special">;</span></code>
+ </p></blockquote></div>
+<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
+<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>; else <code class="computeroutput"><span class="keyword">false</span></code>.
+ </li>
+<li class="listitem">
+ <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> in certain boolean contexts.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Example:</strong></span>
+<pre class="programlisting"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">opt</span> <span class="special">;</span>
+<span class="identifier">assert</span> <span class="special">(</span> <span class="special">!</span><span class="identifier">opt</span> <span class="special">);</span>
+<span class="special">*</span><span class="identifier">opt</span> <span class="special">=</span> <span class="identifier">some_T</span> <span class="special">;</span>
+
+<span class="comment">// Notice the "double-bang" idiom here.</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="special">;</span>
+</pre>
+ </li>
+</ul></div>
+<p>
+ <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
+ </p>
+<a name="reference_optional_is_initialized"></a><div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="keyword">bool</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">is_initialized</span><span class="special">()</span> <span class="keyword">const</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>Deprecated:</strong></span> Same as <code class="computeroutput"><span class="keyword">explicit</span> <span class="keyword">operator</span>
+ <span class="keyword">bool</span> <span class="special">()</span>
+ <span class="special">;</span></code>
+ </li></ul></div>
+<p>
+ <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
+ </p>
+<h6>
+<a name="boost_optional.reference.header__boost_optional_optional_hpp_.detailed_semantics.h1"></a>
+ <span class="phrase"><a name="boost_optional.reference.header__boost_optional_optional_hpp_.detailed_semantics.free_functions"></a></span><a class="link" href="detailed_semantics.html#boost_optional.reference.header__boost_optional_optional_hpp_.detailed_semantics.free_functions">Free
+ functions</a>
+ </h6>
+<p>
+ <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
+ </p>
+<a name="reference_make_optional_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;</span> <span class="identifier">make_optional</span><span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">v</span> <span class="special">)</span></code>
+ </p></blockquote></div>
+<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
+<li class="listitem">
+ <span class="bold"><strong>Returns: </strong></span> <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;(</span><span class="identifier">v</span><span class="special">)</span></code> for the <span class="emphasis"><em>deduced</em></span>
+ type <code class="computeroutput"><span class="identifier">T</span></code> of <code class="computeroutput"><span class="identifier">v</span></code>.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Example:</strong></span>
+<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">void</span> <span class="identifier">foo</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">opt</span> <span class="special">)</span> <span class="special">;</span>
+
+<span class="identifier">foo</span> <span class="special">(</span> <span class="identifier">make_optional</span><span class="special">(</span><span class="number">1</span><span class="special">+</span><span class="number">1</span><span class="special">)</span> <span class="special">)</span> <span class="special">;</span> <span class="comment">// Creates an optional&lt;int&gt;</span>
+</pre>
+ </li>
+</ul></div>
+<p>
+ <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
+ </p>
+<a name="reference_make_optional_bool_value"></a><div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span></code> <span class="emphasis"><em>(not a ref)</em></span><code class="computeroutput"><span class="special">&gt;</span> <span class="identifier">make_optional</span><span class="special">(</span> <span class="keyword">bool</span> <span class="identifier">condition</span><span class="special">,</span>
+ <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">v</span> <span class="special">)</span></code>
+ </p></blockquote></div>
+<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
+<li class="listitem">
+ <span class="bold"><strong>Returns: </strong></span> <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;(</span><span class="identifier">condition</span><span class="special">,</span><span class="identifier">v</span><span class="special">)</span></code> for the <span class="emphasis"><em>deduced</em></span>
+ type <code class="computeroutput"><span class="identifier">T</span></code> of <code class="computeroutput"><span class="identifier">v</span></code>.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Example:</strong></span>
+<pre class="programlisting"><span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&gt;</span> <span class="identifier">calculate_foo</span><span class="special">()</span>
+<span class="special">{</span>
+ <span class="keyword">double</span> <span class="identifier">val</span> <span class="special">=</span> <span class="identifier">compute_foo</span><span class="special">();</span>
+ <span class="keyword">return</span> <span class="identifier">make_optional</span><span class="special">(</span><span class="identifier">is_not_nan_and_finite</span><span class="special">(</span><span class="identifier">val</span><span class="special">),</span><span class="identifier">val</span><span class="special">);</span>
+<span class="special">}</span>
+
+<span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&gt;</span> <span class="identifier">v</span> <span class="special">=</span> <span class="identifier">calculate_foo</span><span class="special">();</span>
+<span class="keyword">if</span> <span class="special">(</span> <span class="special">!</span><span class="identifier">v</span> <span class="special">)</span>
+ <span class="identifier">error</span><span class="special">(</span><span class="string">"foo wasn't computed"</span><span class="special">);</span>
+</pre>
+ </li>
+</ul></div>
+<p>
+ <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
+ </p>
+<a name="reference_operator_compare_equal_optional_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="keyword">bool</span> <span class="keyword">operator</span>
+ <span class="special">==</span> <span class="special">(</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">y</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">T</span></code>
+ shall meet requirements of <a href="http://www.sgi.com/tech/stl/EqualityComparable.html" target="_top"><code class="computeroutput"><span class="identifier">EqualityComparable</span></code></a>.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Returns:</strong></span> If both <code class="computeroutput"><span class="identifier">x</span></code>
+ and <code class="computeroutput"><span class="identifier">y</span></code> are initialized,
+ <code class="computeroutput"><span class="special">(*</span><span class="identifier">x</span>
+ <span class="special">==</span> <span class="special">*</span><span class="identifier">y</span><span class="special">)</span></code>.
+ If only <code class="computeroutput"><span class="identifier">x</span></code> or <code class="computeroutput"><span class="identifier">y</span></code> is initialized, <code class="computeroutput"><span class="keyword">false</span></code>.
+ If both are uninitialized, <code class="computeroutput"><span class="keyword">true</span></code>.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Notes:</strong></span> This definition guarantees
+ that <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code>
+ not containing a value is compared unequal to any <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code> containing any value, and equal
+ to any other <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code> not containing a value. Pointers
+ have shallow relational operators while <code class="computeroutput"><span class="identifier">optional</span></code>
+ has deep relational operators. Do not use <code class="computeroutput"><span class="keyword">operator</span><span class="special">==</span></code> directly in generic code which expect
+ to be given either an <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code> or a pointer; use <a href="../../../../../../utility/OptionalPointee.html#equal" target="_top"><code class="computeroutput"><span class="identifier">equal_pointees</span><span class="special">()</span></code></a>
+ instead
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Example:</strong></span>
+<pre class="programlisting"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">oN</span><span class="special">,</span> <span class="identifier">oN_</span><span class="special">;</span>
+<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">o1</span><span class="special">(</span><span class="identifier">T</span><span class="special">(</span><span class="number">1</span><span class="special">)),</span> <span class="identifier">o1_</span><span class="special">(</span><span class="identifier">T</span><span class="special">(</span><span class="number">1</span><span class="special">));</span>
+<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">o2</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="identifier">assert</span> <span class="special">(</span> <span class="identifier">oN</span> <span class="special">==</span> <span class="identifier">oN</span> <span class="special">);</span> <span class="comment">// Identity implies equality</span>
+<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">o1</span> <span class="special">==</span> <span class="identifier">o1</span> <span class="special">);</span> <span class="comment">//</span>
+
+<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">oN</span> <span class="special">==</span> <span class="identifier">oN_</span> <span class="special">);</span> <span class="comment">// Both uninitialized compare equal</span>
+
+<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">oN</span> <span class="special">!=</span> <span class="identifier">o1</span> <span class="special">);</span> <span class="comment">// Initialized unequal to initialized.</span>
+
+<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">o1</span> <span class="special">==</span> <span class="identifier">o1_</span> <span class="special">);</span> <span class="comment">// Both initialized compare as (*lhs == *rhs)</span>
+<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">o1</span> <span class="special">!=</span> <span class="identifier">o2</span> <span class="special">);</span> <span class="comment">//</span>
+</pre>
+ </li>
+</ul></div>
+<p>
+ <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
+ </p>
+<a name="reference_operator_compare_less_optional_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="keyword">bool</span> <span class="keyword">operator</span>
+ <span class="special">&lt;</span> <span class="special">(</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">y</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> Expression <code class="computeroutput"><span class="special">*</span><span class="identifier">x</span> <span class="special">&lt;</span> <span class="special">*</span><span class="identifier">y</span></code> shall be well-formed and its result
+ shall be convertible to <code class="computeroutput"><span class="keyword">bool</span></code>.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Returns:</strong></span> <code class="computeroutput"><span class="special">(!</span><span class="identifier">y</span><span class="special">)</span> <span class="special">?</span> <span class="keyword">false</span> <span class="special">:</span> <span class="special">(!</span><span class="identifier">x</span><span class="special">)</span> <span class="special">?</span> <span class="keyword">true</span> <span class="special">:</span> <span class="special">*</span><span class="identifier">x</span> <span class="special">&lt;</span>
+ <span class="special">*</span><span class="identifier">y</span></code>.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Notes:</strong></span> This definition guarantees
+ that <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code>
+ not containing a value is ordered as less than any <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code> containing any value, and equivalent
+ to any other <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code> not containing a value. Pointers
+ have shallow relational operators while <code class="computeroutput"><span class="identifier">optional</span></code>
+ has deep relational operators. Do not use <code class="computeroutput"><span class="keyword">operator</span><span class="special">&lt;</span></code> directly in generic code which
+ expect to be given either an <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code> or a pointer; use <a href="../../../../../../utility/OptionalPointee.html#less" target="_top"><code class="computeroutput"><span class="identifier">less_pointees</span><span class="special">()</span></code></a>
+ instead. <code class="computeroutput"><span class="identifier">T</span></code> need not
+ be <a href="http://www.sgi.com/tech/stl/LessThanComparable.html" target="_top"><code class="computeroutput"><span class="identifier">LessThanComparable</span></code></a>. Only
+ single <code class="computeroutput"><span class="keyword">operator</span><span class="special">&lt;</span></code>
+ is required. Other relational operations are defined in terms of this
+ one. If <code class="computeroutput"><span class="identifier">T</span></code>'s <code class="computeroutput"><span class="keyword">operator</span><span class="special">&lt;</span></code>
+ satisfies the axioms of <a href="http://www.sgi.com/tech/stl/LessThanComparable.html" target="_top"><code class="computeroutput"><span class="identifier">LessThanComparable</span></code></a> (transitivity,
+ antisymmetry and irreflexivity), <code class="computeroutput"><span class="identifier">optinal</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code> is <a href="http://www.sgi.com/tech/stl/LessThanComparable.html" target="_top"><code class="computeroutput"><span class="identifier">LessThanComparable</span></code></a>.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Example:</strong></span>
+<pre class="programlisting"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">oN</span><span class="special">,</span> <span class="identifier">oN_</span><span class="special">;</span>
+<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">o0</span><span class="special">(</span><span class="identifier">T</span><span class="special">(</span><span class="number">0</span><span class="special">));</span>
+<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">o1</span><span class="special">(</span><span class="identifier">T</span><span class="special">(</span><span class="number">1</span><span class="special">));</span>
+
+<span class="identifier">assert</span> <span class="special">(</span> <span class="special">!(</span><span class="identifier">oN</span> <span class="special">&lt;</span> <span class="identifier">oN</span><span class="special">)</span> <span class="special">);</span> <span class="comment">// Identity implies equivalence</span>
+<span class="identifier">assert</span> <span class="special">(</span> <span class="special">!(</span><span class="identifier">o1</span> <span class="special">&lt;</span> <span class="identifier">o1</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">oN</span> <span class="special">&lt;</span> <span class="identifier">oN_</span><span class="special">)</span> <span class="special">);</span> <span class="comment">// Two uninitialized are equivalent</span>
+<span class="identifier">assert</span> <span class="special">(</span> <span class="special">!(</span><span class="identifier">oN_</span> <span class="special">&lt;</span> <span class="identifier">oN</span><span class="special">)</span> <span class="special">);</span>
+
+<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">oN</span> <span class="special">&lt;</span> <span class="identifier">o0</span> <span class="special">);</span> <span class="comment">// Uninitialized is less than initialized</span>
+<span class="identifier">assert</span> <span class="special">(</span> <span class="special">!(</span><span class="identifier">o0</span> <span class="special">&lt;</span> <span class="identifier">oN</span><span class="special">)</span> <span class="special">);</span>
+
+<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">o1</span> <span class="special">&lt;</span> <span class="identifier">o2</span> <span class="special">)</span> <span class="special">;</span> <span class="comment">// Two initialized compare as (*lhs &lt; *rhs)</span>
+<span class="identifier">assert</span> <span class="special">(</span> <span class="special">!(</span><span class="identifier">o2</span> <span class="special">&lt;</span> <span class="identifier">o1</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">o2</span> <span class="special">&lt;</span> <span class="identifier">o2</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>
+<a name="reference_operator_compare_not_equal_optional_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="keyword">bool</span> <span class="keyword">operator</span>
+ <span class="special">!=</span> <span class="special">(</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">y</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>Returns: </strong></span> <code class="computeroutput"><span class="special">!(</span>
+ <span class="identifier">x</span> <span class="special">==</span>
+ <span class="identifier">y</span> <span class="special">);</span></code>
+ </li></ul></div>
+<p>
+ <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
+ </p>
+<a name="reference_operator_compare_greater_optional_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="keyword">bool</span> <span class="keyword">operator</span>
+ <span class="special">&gt;</span> <span class="special">(</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">y</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>Returns: </strong></span> <code class="computeroutput"><span class="special">(</span>
+ <span class="identifier">y</span> <span class="special">&lt;</span>
+ <span class="identifier">x</span> <span class="special">);</span></code>
+ </li></ul></div>
+<p>
+ <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
+ </p>
+<a name="reference_operator_compare_less_or_equal_optional_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="keyword">bool</span> <span class="keyword">operator</span>
+ <span class="special">&lt;=</span> <span class="special">(</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">y</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>Returns: </strong></span> <code class="computeroutput"><span class="special">!(</span>
+ <span class="identifier">y</span> <span class="special">&lt;</span>
+ <span class="identifier">x</span> <span class="special">);</span></code>
+ </li></ul></div>
+<p>
+ <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
+ </p>
+<a name="reference_operator_compare_greater_or_equal_optional_optional"></a><div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="keyword">bool</span> <span class="keyword">operator</span>
+ <span class="special">&gt;=</span> <span class="special">(</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">y</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>Returns: </strong></span> <code class="computeroutput"><span class="special">!(</span>
+ <span class="identifier">x</span> <span class="special">&lt;</span>
+ <span class="identifier">y</span> <span class="special">);</span></code>
+ </li></ul></div>
+<p>
+ <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
+ </p>
+<a name="reference_operator_compare_equal_optional_none"></a><div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="keyword">bool</span> <span class="keyword">operator</span>
+ <span class="special">==</span> <span class="special">(</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">none_t</span> <span class="special">)</span>
+ <span class="keyword">noexcept</span><span class="special">;</span></code>
+ </p></blockquote></div>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="keyword">bool</span> <span class="keyword">operator</span>
+ <span class="special">==</span> <span class="special">(</span>
+ <span class="identifier">none_t</span><span class="special">,</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span> <span class="special">)</span> <span class="keyword">noexcept</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>Returns:</strong></span> <code class="computeroutput"><span class="special">!</span><span class="identifier">x</span></code>.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Notes:</strong></span> <code class="computeroutput"><span class="identifier">T</span></code>
+ need not meet requirements of <a href="http://www.sgi.com/tech/stl/EqualityComparable.html" target="_top"><code class="computeroutput"><span class="identifier">EqualityComparable</span></code></a>.
+ </li>
+</ul></div>
+<p>
+ <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
+ </p>
+<a name="reference_operator_compare_not_equal_optional_none"></a><div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="keyword">bool</span> <span class="keyword">operator</span>
+ <span class="special">!=</span> <span class="special">(</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">none_t</span> <span class="special">)</span>
+ <span class="keyword">noexcept</span><span class="special">;</span></code>
+ </p></blockquote></div>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><span class="keyword">bool</span> <span class="keyword">operator</span>
+ <span class="special">!=</span> <span class="special">(</span>
+ <span class="identifier">none_t</span><span class="special">,</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span> <span class="special">)</span> <span class="keyword">noexcept</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>Returns: </strong></span> <code class="computeroutput"><span class="special">!(</span>
+ <span class="identifier">x</span> <span class="special">==</span>
+ <span class="identifier">y</span> <span class="special">);</span></code>
+ </li></ul></div>
+<p>
+ <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span>
+ </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>
+ <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&amp;</span> <span class="identifier">y</span>
+ <span class="special">)</span> <span class="special">;</span></code>
+ </p></blockquote></div>
+<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
+<li class="listitem">
+ <span class="bold"><strong>Requires:</strong></span> Lvalues of type <code class="computeroutput"><span class="identifier">T</span></code> shall be swappable and <code class="computeroutput"><span class="identifier">T</span></code> shall be <code class="computeroutput"><span class="identifier">MoveConstructible</span></code>.
+ </li>
+<li class="listitem">
+<p class="simpara">
+ <span class="bold"><strong>Effects:</strong></span>
+ </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+<col>
+</colgroup>
+<thead><tr>
+<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>
+<tr>
+<td>
+ <p>
+ <code class="computeroutput"><span class="identifier">rhs</span></code> contains
+ a value
+ </p>
+ </td>
+<td>
+ <p>
+ calls <code class="computeroutput"><span class="identifier">swap</span><span class="special">(*(*</span><span class="keyword">this</span><span class="special">),</span> <span class="special">*</span><span class="identifier">rhs</span><span class="special">)</span></code>
+ </p>
+ </td>
+<td>
+ <p>
+ initializes the contained value of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> as if direct-initializing
+ an object of type <code class="computeroutput"><span class="identifier">T</span></code>
+ with the expression <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(*</span><span class="identifier">rhs</span><span class="special">)</span></code>, followed by <code class="computeroutput"><span class="identifier">rhs</span><span class="special">.</span><span class="identifier">val</span><span class="special">-&gt;</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="special">*</span><span class="keyword">this</span></code>
+ contains a value and <code class="computeroutput"><span class="identifier">rhs</span></code>
+ does not contain a value
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <code class="computeroutput"><span class="identifier">rhs</span></code> does
+ not contain a value
+ </p>
+ </td>
+<td>
+ <p>
+ initializes the contained value of <code class="computeroutput"><span class="identifier">rhs</span></code>
+ as if direct-initializing an object of type <code class="computeroutput"><span class="identifier">T</span></code> with the expression
+ <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(*(*</span><span class="keyword">this</span><span class="special">))</span></code>,
+ followed by <code class="computeroutput"><span class="identifier">val</span><span class="special">-&gt;</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="special">*</span><span class="keyword">this</span></code> does not contain a value
+ and <code class="computeroutput"><span class="identifier">rhs</span></code> contains
+ a value
+ </p>
+ </td>
+<td>
+ <p>
+ no effect
+ </p>
+ </td>
+</tr>
+</tbody>
+</table></div>
+</li>
+<li class="listitem">
+ <span class="bold"><strong>Postconditions:</strong></span> The states of <code class="computeroutput"><span class="identifier">x</span></code> and <code class="computeroutput"><span class="identifier">y</span></code>
+ interchanged.
+ </li>
+<li class="listitem">
+ <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">&amp;,</span><span class="identifier">T</span><span class="special">&amp;)</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="special">&amp;&amp;</span> <span class="special">)</span></code>
+ throws.
+ </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="number">12</span><span class="special">);</span>
+<span class="identifier">T</span> <span class="identifier">y</span><span class="special">(</span><span class="number">21</span><span class="special">);</span>
+<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">def0</span> <span class="special">;</span>
+<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">def1</span> <span class="special">;</span>
+<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">optX</span><span class="special">(</span><span class="identifier">x</span><span class="special">);</span>
+<span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">optY</span><span class="special">(</span><span class="identifier">y</span><span class="special">);</span>
+
+<span class="identifier">boost</span><span class="special">::</span><span class="identifier">swap</span><span class="special">(</span><span class="identifier">def0</span><span class="special">,</span><span class="identifier">def1</span><span class="special">);</span> <span class="comment">// no-op</span>
+
+<span class="identifier">boost</span><span class="special">::</span><span class="identifier">swap</span><span class="special">(</span><span class="identifier">def0</span><span class="special">,</span><span class="identifier">optX</span><span class="special">);</span>
+<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">def0</span> <span class="special">==</span> <span class="identifier">x</span> <span class="special">);</span>
+<span class="identifier">assert</span> <span class="special">(</span> <span class="special">!</span><span class="identifier">optX</span> <span class="special">);</span>
+
+<span class="identifier">boost</span><span class="special">::</span><span class="identifier">swap</span><span class="special">(</span><span class="identifier">def0</span><span class="special">,</span><span class="identifier">optX</span><span class="special">);</span> <span class="comment">// Get back to original values</span>
+
+<span class="identifier">boost</span><span class="special">::</span><span class="identifier">swap</span><span class="special">(</span><span class="identifier">optX</span><span class="special">,</span><span class="identifier">optY</span><span class="special">);</span>
+<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">optX</span> <span class="special">==</span> <span class="identifier">y</span> <span class="special">);</span>
+<span class="identifier">assert</span> <span class="special">(</span> <span class="special">*</span><span class="identifier">optY</span> <span class="special">==</span> <span class="identifier">x</span> <span class="special">);</span>
+</pre>
+ </li>
+</ul></div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014, 2015 Andrzej Krzemie&#324;ski<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="../../../optional/reference/header__boost_optional_optional_hpp_.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../../optional/reference/header__boost_optional_optional_hpp_.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../header__boost_optional_hpp_.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
diff --git a/libs/optional/doc/html/boost_optional/reference/io_header.html b/libs/optional/doc/html/boost_optional/reference/io_header.html
new file mode 100644
index 000000000..c61e5c6c8
--- /dev/null
+++ b/libs/optional/doc/html/boost_optional/reference/io_header.html
@@ -0,0 +1,72 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Header &lt;boost/optional/optional_io.hpp&gt;</title>
+<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<link rel="home" href="../../index.html" title="Boost.Optional">
+<link rel="up" href="../../optional/reference.html" title="Reference">
+<link rel="prev" href="header__boost_optional_bad_optional_access_hpp_/detailed_semantics.html" title="Detailed semantics">
+<link rel="next" href="io_header/io_semantics.html" title="Detailed semantics">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td>
+<td align="center"><a href="../../../../../../index.html">Home</a></td>
+<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td>
+<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
+<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
+<td align="center"><a href="../../../../../../more/index.htm">More</a></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="header__boost_optional_bad_optional_access_hpp_/detailed_semantics.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../optional/reference.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="io_header/io_semantics.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="boost_optional.reference.io_header"></a><a class="link" href="io_header.html" title="Header &lt;boost/optional/optional_io.hpp&gt;">Header &lt;boost/optional/optional_io.hpp&gt;</a>
+</h3></div></div></div>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_optional.reference.io_header.io_synop"></a><a class="link" href="io_header.html#boost_optional.reference.io_header.io_synop" title="Synopsis">Synopsis</a>
+</h4></div></div></div>
+<p>
+</p>
+<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">istream</span><span class="special">&gt;</span>
+<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">ostream</span><span class="special">&gt;</span>
+<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</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">hpp</span><span class="special">&gt;</span>
+
+<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
+
+<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CharType</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CharTrait</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharType</span><span class="special">,</span> <span class="identifier">CharTrait</span><span class="special">&gt;&amp;</span>
+ <span class="keyword">operator</span><span class="special">&lt;&lt;(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharType</span><span class="special">,</span> <span class="identifier">CharTrait</span><span class="special">&gt;&amp;</span> <span class="identifier">out</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">v</span><span class="special">);</span> <a class="link" href="io_header/io_semantics.html#reference_operator_ostream"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
+
+ <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CharType</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CharTrait</span><span class="special">&gt;</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharType</span><span class="special">,</span> <span class="identifier">CharTrait</span><span class="special">&gt;&amp;</span>
+ <span class="keyword">operator</span><span class="special">&lt;&lt;(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharType</span><span class="special">,</span> <span class="identifier">CharTrait</span><span class="special">&gt;&amp;</span> <span class="identifier">out</span><span class="special">,</span> <span class="identifier">none_t</span> <span class="keyword">const</span><span class="special">&amp;);</span> <a class="link" href="io_header/io_semantics.html#reference_operator_ostream_none"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
+
+<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CharType</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CharTrait</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_istream</span><span class="special">&lt;</span><span class="identifier">CharType</span><span class="special">,</span> <span class="identifier">CharTrait</span><span class="special">&gt;&amp;</span>
+ <span class="keyword">operator</span><span class="special">&gt;&gt;(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_istream</span><span class="special">&lt;</span><span class="identifier">CharType</span><span class="special">,</span> <span class="identifier">CharTrait</span><span class="special">&gt;&amp;</span> <span class="identifier">in</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&amp;</span> <span class="identifier">v</span><span class="special">);</span> <a class="link" href="io_header/io_semantics.html#reference_operator_istream"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
+
+<span class="special">}</span> <span class="comment">// namespace boost</span>
+</pre>
+<p>
+ </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014, 2015 Andrzej Krzemie&#324;ski<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="header__boost_optional_bad_optional_access_hpp_/detailed_semantics.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../optional/reference.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="io_header/io_semantics.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
diff --git a/libs/optional/doc/html/boost_optional/reference/io_header/io_semantics.html b/libs/optional/doc/html/boost_optional/reference/io_header/io_semantics.html
new file mode 100644
index 000000000..c368ac728
--- /dev/null
+++ b/libs/optional/doc/html/boost_optional/reference/io_header/io_semantics.html
@@ -0,0 +1,112 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Detailed semantics</title>
+<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<link rel="home" href="../../../index.html" title="Boost.Optional">
+<link rel="up" href="../io_header.html" title="Header &lt;boost/optional/optional_io.hpp&gt;">
+<link rel="prev" href="../io_header.html" title="Header &lt;boost/optional/optional_io.hpp&gt;">
+<link rel="next" href="../header__boost_optional_optional_fwd_hpp_.html" title="Header &lt;boost/optional/optional_fwd.hpp&gt;">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td>
+<td align="center"><a href="../../../../../../../index.html">Home</a></td>
+<td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td>
+<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
+<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
+<td align="center"><a href="../../../../../../../more/index.htm">More</a></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="../io_header.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../io_header.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../header__boost_optional_optional_fwd_hpp_.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_optional.reference.io_header.io_semantics"></a><a class="link" href="io_semantics.html" title="Detailed semantics">Detailed
+ semantics</a>
+</h4></div></div></div>
+<p>
+ <a name="reference_operator_ostream"></a><code class="computeroutput"><span class="keyword">template</span>
+ <span class="special">&lt;</span><span class="keyword">class</span>
+ <span class="identifier">CharType</span><span class="special">,</span>
+ <span class="keyword">class</span> <span class="identifier">CharTrait</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span></code>
+ <br> &#160;&#160;&#160;&#160;<code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharType</span><span class="special">,</span> <span class="identifier">CharTrait</span><span class="special">&gt;&amp;</span></code> <br> &#160;&#160;&#160;&#160;<code class="computeroutput"><span class="keyword">operator</span><span class="special">&lt;&lt;(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharType</span><span class="special">,</span> <span class="identifier">CharTrait</span><span class="special">&gt;&amp;</span>
+ <span class="identifier">out</span><span class="special">,</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">v</span><span class="special">);</span></code>
+ </p>
+<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
+<li class="listitem">
+ <span class="bold"><strong>Effect:</strong></span> Outputs an implementation-defined
+ string. The output contains the information about whether the optional
+ object contains a value or not. If <code class="computeroutput"><span class="identifier">v</span></code>
+ contains a value, the output contains result of calling <code class="computeroutput"><span class="identifier">out</span> <span class="special">&lt;&lt;</span>
+ <span class="special">*</span><span class="identifier">v</span></code>.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Returns:</strong></span> <code class="computeroutput"><span class="identifier">out</span></code>.
+ </li>
+</ul></div>
+<p>
+ <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span> <a name="reference_operator_ostream_none"></a>
+ </p>
+<p>
+ <code class="computeroutput"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CharType</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CharTrait</span><span class="special">,</span>
+ <span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span></code> <br> &#160;&#160;&#160;&#160;<code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharType</span><span class="special">,</span> <span class="identifier">CharTrait</span><span class="special">&gt;&amp;</span></code>
+ <br> &#160;&#160;&#160;&#160;<code class="computeroutput"><span class="keyword">operator</span><span class="special">&lt;&lt;(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharType</span><span class="special">,</span> <span class="identifier">CharTrait</span><span class="special">&gt;&amp;</span> <span class="identifier">out</span><span class="special">,</span> <span class="identifier">none_t</span><span class="special">);</span></code>
+ </p>
+<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
+<li class="listitem">
+ <span class="bold"><strong>Effect:</strong></span> Outputs an implementation-defined
+ string.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Returns:</strong></span> <code class="computeroutput"><span class="identifier">out</span></code>.
+ </li>
+</ul></div>
+<p>
+ <span class="inlinemediaobject"><img src="../../../images/space.png" alt="space"></span> <a name="reference_operator_istream"></a>
+ </p>
+<p>
+ <code class="computeroutput"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">CharType</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">CharTrait</span><span class="special">,</span>
+ <span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span></code> <br> &#160;&#160;&#160;&#160;<code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharType</span><span class="special">,</span> <span class="identifier">CharTrait</span><span class="special">&gt;&amp;</span></code>
+ <br> &#160;&#160;&#160;&#160;<code class="computeroutput"><span class="keyword">operator</span><span class="special">&gt;&gt;(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_istream</span><span class="special">&lt;</span><span class="identifier">CharType</span><span class="special">,</span> <span class="identifier">CharTrait</span><span class="special">&gt;&amp;</span> <span class="identifier">in</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&amp;</span> <span class="identifier">v</span><span class="special">);</span></code>
+ </p>
+<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">T</span></code>
+ is <a href="http://www.sgi.com/tech/stl/DefaultConstructible.html" target="_top"><code class="computeroutput"><span class="identifier">DefaultConstructible</span></code></a> and
+ <code class="computeroutput"><span class="identifier">MoveConstructible</span></code>.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Effect:</strong></span> Reads the value of optional
+ object from <code class="computeroutput"><span class="identifier">in</span></code>. If
+ the string representation indicates that the optional object should
+ contain a value, <code class="computeroutput"><span class="identifier">v</span></code>
+ contains a value and its contained value is obtained as if by default-constructing
+ an object <code class="computeroutput"><span class="identifier">o</span></code> of type
+ <code class="computeroutput"><span class="identifier">T</span></code> and then calling
+ <code class="computeroutput"><span class="identifier">in</span> <span class="special">&gt;&gt;</span>
+ <span class="identifier">o</span></code>; otherwise <code class="computeroutput"><span class="identifier">v</span></code> does not contain a value, and the
+ previously contained value (if any) has been destroyed.
+ </li>
+<li class="listitem">
+ <span class="bold"><strong>Returns:</strong></span> <code class="computeroutput"><span class="identifier">out</span></code>.
+ </li>
+</ul></div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014, 2015 Andrzej Krzemie&#324;ski<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="../io_header.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../io_header.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../header__boost_optional_optional_fwd_hpp_.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
diff --git a/libs/optional/doc/html/boost_optional/relnotes.html b/libs/optional/doc/html/boost_optional/relnotes.html
new file mode 100644
index 000000000..3fb495b3a
--- /dev/null
+++ b/libs/optional/doc/html/boost_optional/relnotes.html
@@ -0,0 +1,144 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Release Notes</title>
+<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<link rel="home" href="../index.html" title="Boost.Optional">
+<link rel="up" href="../index.html" title="Boost.Optional">
+<link rel="prev" href="dependencies_and_portability/optional_reference_binding.html" title="Optional Reference Binding">
+<link rel="next" href="acknowledgements.html" title="Acknowledgements">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td>
+<td align="center"><a href="../../../../../index.html">Home</a></td>
+<td align="center"><a href="../../../../../libs/libraries.htm">Libraries</a></td>
+<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
+<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
+<td align="center"><a href="../../../../../more/index.htm">More</a></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="dependencies_and_portability/optional_reference_binding.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="acknowledgements.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="boost_optional.relnotes"></a><a class="link" href="relnotes.html" title="Release Notes">Release Notes</a>
+</h2></div></div></div>
+<h4>
+<a name="boost_optional.relnotes.h0"></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
+ Release 1.58</a>
+ </h4>
+<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
+<li class="listitem">
+ <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">none_t</span></code> is no longer convertible from
+ literal <code class="computeroutput"><span class="number">0</span></code>. This avoids a bug
+ where <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">rational</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;&gt;</span> <span class="identifier">oi</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span></code> would
+ initialize an optional object with no contained value.
+ </li>
+<li class="listitem">
+ 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>
+ by using safe-bool idiom. This addresses <a href="https://svn.boost.org/trac/boost/ticket/10825" target="_top">Trac
+ #10825</a>
+ </li>
+<li class="listitem">
+ IOStream operators are now mentioned in documentation.
+ </li>
+<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>.
+ This can be used to work around <a href="https://svn.boost.org/trac/boost/ticket/10399" target="_top">Trac
+ #10399</a>
+ </li>
+<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>
+ is not assignable or convertible to <code class="computeroutput"><span class="identifier">T</span></code>
+ (<a href="https://svn.boost.org/trac/boost/ticket/11087" target="_top">Trac #11087</a>).
+ </li>
+<li class="listitem">
+ Value accessors now work correctly on rvalues of <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span></code> (<a href="https://svn.boost.org/trac/boost/ticket/10839" target="_top">Trac
+ #10839</a>).
+ </li>
+</ul></div>
+<h4>
+<a name="boost_optional.relnotes.h1"></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
+ Release 1.57</a>
+ </h4>
+<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
+ <a href="https://github.com/boostorg/optional/pull/9" target="_top">Git pull #9</a>:
+ <span class="emphasis"><em>"Supply <code class="computeroutput"><span class="special">&lt;</span><span class="identifier">string</span><span class="special">&gt;</span></code>
+ 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>
+<h4>
+<a name="boost_optional.relnotes.h2"></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
+ Release 1.56</a>
+ </h4>
+<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
+<li class="listitem">
+ Added support for rvalue references. Now <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code> works with moveable but non-copyable
+ <code class="computeroutput"><span class="identifier">T</span></code>'s,
+ </li>
+<li class="listitem">
+ Improved <code class="computeroutput"><span class="identifier">swap</span></code> (now uses
+ move operations),
+ </li>
+<li class="listitem">
+ Added function <code class="computeroutput"><span class="identifier">emplace</span><span class="special">()</span></code>. This is the last of the requests from
+ <a href="https://svn.boost.org/trac/boost/ticket/1841" target="_top">Trac #1841</a>,
+ </li>
+<li class="listitem">
+ <code class="computeroutput"><span class="identifier">optional</span></code> is moveable, including
+ conditional <code class="computeroutput"><span class="keyword">noexcept</span></code> specifications,
+ which make it <code class="computeroutput"><span class="identifier">move_if_noexcept</span></code>-friendly,
+ </li>
+<li class="listitem">
+ Using explicit operator bool() on platforms that support it (<a href="https://svn.boost.org/trac/boost/ticket/4227" target="_top">Trac
+ #4227</a>) (breaking change),
+ </li>
+<li class="listitem">
+ Forward declaration of <code class="computeroutput"><span class="keyword">operator</span><span class="special">&lt;&lt;(</span><span class="identifier">ostream</span><span class="special">&amp;,</span> <span class="identifier">optional</span>
+ <span class="keyword">const</span><span class="special">&amp;)</span></code>
+ to prevent inadvertent incorrect serialization of optional objects,
+ </li>
+<li class="listitem">
+ Removed deprecated function <code class="computeroutput"><span class="identifier">reset</span><span class="special">()</span></code> from examples (<a href="https://svn.boost.org/trac/boost/ticket/9005" target="_top">Trac
+ #9005</a>),
+ </li>
+<li class="listitem">
+ Equality comparison with <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">none</span></code>
+ does not require that <code class="computeroutput"><span class="identifier">T</span></code>
+ be EqualityComparable,
+ </li>
+<li class="listitem">
+ Optional rvalue references are explicitly disallowed,
+ </li>
+<li class="listitem">
+ Binding temporaries to optional references is explicitly disallowed (breaking
+ change),
+ </li>
+<li class="listitem">
+ More ways to access the contained value, functions <code class="computeroutput"><span class="identifier">value</span><span class="special">()</span></code>, <code class="computeroutput"><span class="identifier">value_or</span><span class="special">()</span></code>, <code class="computeroutput"><span class="identifier">value_or_eval</span><span class="special">()</span></code>,
+ </li>
+<li class="listitem">
+ Updated and reorganized documentation, added tutorial and quick guide sections.
+ </li>
+</ul></div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014, 2015 Andrzej Krzemie&#324;ski<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="dependencies_and_portability/optional_reference_binding.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="acknowledgements.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
diff --git a/libs/optional/doc/html/boost_optional/tutorial/a_note_about_optional_bool_.html b/libs/optional/doc/html/boost_optional/tutorial/a_note_about_optional_bool_.html
index ea3618b87..def5bbfd2 100644
--- a/libs/optional/doc/html/boost_optional/tutorial/a_note_about_optional_bool_.html
+++ b/libs/optional/doc/html/boost_optional/tutorial/a_note_about_optional_bool_.html
@@ -94,7 +94,7 @@
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
-<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014 Andrzej Krzemie&#324;ski<p>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014, 2015 Andrzej Krzemie&#324;ski<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>
diff --git a/libs/optional/doc/html/boost_optional/tutorial/design_overview.html b/libs/optional/doc/html/boost_optional/tutorial/design_overview.html
index d6598bca6..cc5e3b467 100644
--- a/libs/optional/doc/html/boost_optional/tutorial/design_overview.html
+++ b/libs/optional/doc/html/boost_optional/tutorial/design_overview.html
@@ -170,7 +170,7 @@
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
-<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014 Andrzej Krzemie&#324;ski<p>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014, 2015 Andrzej Krzemie&#324;ski<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>
diff --git a/libs/optional/doc/html/boost_optional/tutorial/design_overview/the_interface.html b/libs/optional/doc/html/boost_optional/tutorial/design_overview/the_interface.html
index 984ae4bf1..c3833ffb8 100644
--- a/libs/optional/doc/html/boost_optional/tutorial/design_overview/the_interface.html
+++ b/libs/optional/doc/html/boost_optional/tutorial/design_overview/the_interface.html
@@ -63,8 +63,8 @@
</p>
<h6>
<a name="boost_optional.tutorial.design_overview.the_interface.h0"></a>
- <span class="phrase"><a name="boost_optional.tutorial.design_overview.the_interface.lexically_hinted_value_access_in_the_presence_of_possibly_untitialized_optional_objects__the_operators___and___gt_"></a></span><a class="link" href="the_interface.html#boost_optional.tutorial.design_overview.the_interface.lexically_hinted_value_access_in_the_presence_of_possibly_untitialized_optional_objects__the_operators___and___gt_">Lexically-hinted
- Value Access in the presence of possibly untitialized optional objects:
+ <span class="phrase"><a name="boost_optional.tutorial.design_overview.the_interface.lexically_hinted_value_access_in_the_presence_of_possibly_uninitialized_optional_objects__the_operators___and___gt_"></a></span><a class="link" href="the_interface.html#boost_optional.tutorial.design_overview.the_interface.lexically_hinted_value_access_in_the_presence_of_possibly_uninitialized_optional_objects__the_operators___and___gt_">Lexically-hinted
+ Value Access in the presence of possibly uninitialized optional objects:
The operators * and -&gt;</a>
</h6>
<p>
@@ -173,7 +173,7 @@
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
-<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014 Andrzej Krzemie&#324;ski<p>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014, 2015 Andrzej Krzemie&#324;ski<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>
diff --git a/libs/optional/doc/html/boost_optional/tutorial/design_overview/the_semantics.html b/libs/optional/doc/html/boost_optional/tutorial/design_overview/the_semantics.html
index 5dbc63b32..9a38fefe8 100644
--- a/libs/optional/doc/html/boost_optional/tutorial/design_overview/the_semantics.html
+++ b/libs/optional/doc/html/boost_optional/tutorial/design_overview/the_semantics.html
@@ -107,7 +107,7 @@
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
-<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014 Andrzej Krzemie&#324;ski<p>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014, 2015 Andrzej Krzemie&#324;ski<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>
diff --git a/libs/optional/doc/html/boost_optional/tutorial/exception_safety_guarantees.html b/libs/optional/doc/html/boost_optional/tutorial/exception_safety_guarantees.html
index ea3fa8f5e..dfa34c85c 100644
--- a/libs/optional/doc/html/boost_optional/tutorial/exception_safety_guarantees.html
+++ b/libs/optional/doc/html/boost_optional/tutorial/exception_safety_guarantees.html
@@ -161,7 +161,7 @@
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
-<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014 Andrzej Krzemie&#324;ski<p>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014, 2015 Andrzej Krzemie&#324;ski<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>
diff --git a/libs/optional/doc/html/boost_optional/tutorial/in_place_factories.html b/libs/optional/doc/html/boost_optional/tutorial/in_place_factories.html
index d6907b9e3..4cfef3256 100644
--- a/libs/optional/doc/html/boost_optional/tutorial/in_place_factories.html
+++ b/libs/optional/doc/html/boost_optional/tutorial/in_place_factories.html
@@ -183,7 +183,7 @@
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
-<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014 Andrzej Krzemie&#324;ski<p>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014, 2015 Andrzej Krzemie&#324;ski<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>
diff --git a/libs/optional/doc/html/boost_optional/tutorial/io_operators.html b/libs/optional/doc/html/boost_optional/tutorial/io_operators.html
new file mode 100644
index 000000000..8443a4922
--- /dev/null
+++ b/libs/optional/doc/html/boost_optional/tutorial/io_operators.html
@@ -0,0 +1,87 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>IO operators</title>
+<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<link rel="home" href="../../index.html" title="Boost.Optional">
+<link rel="up" href="../../optional/tutorial.html" title="Tutorial">
+<link rel="prev" href="relational_operators.html" title="Relational operators">
+<link rel="next" href="optional_references.html" title="Optional references">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td>
+<td align="center"><a href="../../../../../../index.html">Home</a></td>
+<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td>
+<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
+<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
+<td align="center"><a href="../../../../../../more/index.htm">More</a></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="relational_operators.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../optional/tutorial.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="optional_references.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="boost_optional.tutorial.io_operators"></a><a class="link" href="io_operators.html" title="IO operators">IO operators</a>
+</h3></div></div></div>
+<p>
+ It is possible to use <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code>
+ with IO streams, provided that <code class="computeroutput"><span class="identifier">T</span></code>
+ can be used with streams. IOStream operators are defined in a separate header.
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iostream</span><span class="special">&gt;</span>
+<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">optional</span><span class="special">/</span><span class="identifier">optional_io</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
+
+<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
+<span class="special">{</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">o1</span> <span class="special">=</span> <span class="number">1</span><span class="special">,</span> <span class="identifier">oN</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">none</span><span class="special">;</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">o1</span><span class="special">;</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">cin</span> <span class="special">&gt;&gt;</span> <span class="identifier">oN</span><span class="special">;</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+<p>
+ The current implementation does not guarantee any particular output. What
+ it guarantees is that if streaming out and then back in <code class="computeroutput"><span class="identifier">T</span></code>
+ gives the same value, then streaming out and then back in <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code>
+ will also give back the same result:
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">cassert</span><span class="special">&gt;</span>
+<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">sstream</span><span class="special">&gt;</span>
+<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">optional</span><span class="special">/</span><span class="identifier">optional_io</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
+
+<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
+<span class="special">{</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">o1</span> <span class="special">=</span> <span class="number">1</span><span class="special">,</span> <span class="identifier">oN</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">none</span><span class="special">;</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">x1</span><span class="special">,</span> <span class="identifier">x2</span><span class="special">;</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">stringstream</span> <span class="identifier">s</span><span class="special">;</span>
+ <span class="identifier">s</span> <span class="special">&lt;&lt;</span> <span class="identifier">o1</span> <span class="special">&lt;&lt;</span> <span class="identifier">oN</span><span class="special">;</span>
+ <span class="identifier">s</span> <span class="special">&gt;&gt;</span> <span class="identifier">x1</span> <span class="special">&gt;&gt;</span> <span class="identifier">x2</span><span class="special">;</span>
+ <span class="identifier">assert</span> <span class="special">(</span><span class="identifier">o1</span> <span class="special">==</span> <span class="identifier">x1</span><span class="special">);</span>
+ <span class="identifier">assert</span> <span class="special">(</span><span class="identifier">oN</span> <span class="special">==</span> <span class="identifier">x2</span><span class="special">);</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014, 2015 Andrzej Krzemie&#324;ski<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="relational_operators.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../optional/tutorial.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="optional_references.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
diff --git a/libs/optional/doc/html/boost_optional/tutorial/optional_references.html b/libs/optional/doc/html/boost_optional/tutorial/optional_references.html
index 4e067c2d9..13209411f 100644
--- a/libs/optional/doc/html/boost_optional/tutorial/optional_references.html
+++ b/libs/optional/doc/html/boost_optional/tutorial/optional_references.html
@@ -6,7 +6,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="../../index.html" title="Boost.Optional">
<link rel="up" href="../../optional/tutorial.html" title="Tutorial">
-<link rel="prev" href="relational_operators.html" title="Relational operators">
+<link rel="prev" href="io_operators.html" title="IO operators">
<link rel="next" href="rebinding_semantics_for_assignment_of_optional_references.html" title="Rebinding semantics for assignment of optional references">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -20,7 +20,7 @@
</tr></table>
<hr>
<div class="spirit-nav">
-<a accesskey="p" href="relational_operators.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../optional/tutorial.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="rebinding_semantics_for_assignment_of_optional_references.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
+<a accesskey="p" href="io_operators.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../optional/tutorial.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="rebinding_semantics_for_assignment_of_optional_references.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
@@ -101,7 +101,7 @@
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
-<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014 Andrzej Krzemie&#324;ski<p>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014, 2015 Andrzej Krzemie&#324;ski<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>
@@ -109,7 +109,7 @@
</tr></table>
<hr>
<div class="spirit-nav">
-<a accesskey="p" href="relational_operators.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../optional/tutorial.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="rebinding_semantics_for_assignment_of_optional_references.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
+<a accesskey="p" href="io_operators.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../optional/tutorial.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="rebinding_semantics_for_assignment_of_optional_references.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>
diff --git a/libs/optional/doc/html/boost_optional/tutorial/performance_considerations.html b/libs/optional/doc/html/boost_optional/tutorial/performance_considerations.html
new file mode 100644
index 000000000..2e2d4ca72
--- /dev/null
+++ b/libs/optional/doc/html/boost_optional/tutorial/performance_considerations.html
@@ -0,0 +1,223 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Performance considerations</title>
+<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<link rel="home" href="../../index.html" title="Boost.Optional">
+<link rel="up" href="../../optional/tutorial.html" title="Tutorial">
+<link rel="prev" href="type_requirements.html" title="Type requirements">
+<link rel="next" href="../../optional/reference.html" title="Reference">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td>
+<td align="center"><a href="../../../../../../index.html">Home</a></td>
+<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td>
+<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
+<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
+<td align="center"><a href="../../../../../../more/index.htm">More</a></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="type_requirements.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../optional/tutorial.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../../optional/reference.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="boost_optional.tutorial.performance_considerations"></a><a class="link" href="performance_considerations.html" title="Performance considerations">Performance
+ considerations</a>
+</h3></div></div></div>
+<p>
+ Technical details aside, the memory layout of <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code>
+ is more-less this:
+ </p>
+<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
+<span class="keyword">class</span> <span class="identifier">optional</span>
+<span class="special">{</span>
+ <span class="keyword">bool</span> <span class="identifier">_initialized</span><span class="special">;</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">aligned_storage_t</span><span class="special">&lt;</span><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">t</span><span class="special">),</span> <span class="keyword">alignof</span><span class="special">(</span><span class="identifier">T</span><span class="special">)&gt;</span> <span class="identifier">_storage</span><span class="special">;</span>
+<span class="special">};</span>
+</pre>
+<p>
+ But for the purpose of this analysis, considering memory layouts, we can
+ think of it as:
+ </p>
+<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
+<span class="keyword">class</span> <span class="identifier">optional</span>
+<span class="special">{</span>
+ <span class="keyword">bool</span> <span class="identifier">_initialized</span><span class="special">;</span>
+ <span class="identifier">T</span> <span class="identifier">_storage</span><span class="special">;</span>
+<span class="special">};</span>
+</pre>
+<p>
+ Given type <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span></code>, and
+ assuming that <code class="computeroutput"><span class="keyword">sizeof</span><span class="special">(</span><span class="keyword">int</span><span class="special">)</span> <span class="special">==</span>
+ <span class="number">4</span></code>, we will get <code class="computeroutput"><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;)</span>
+ <span class="special">==</span> <span class="number">8</span></code>.
+ This is so because of the alignment rules, for our two members we get the
+ following alignment:
+ </p>
+<p>
+ <span class="inlinemediaobject"><img src="../../images/opt_align1.png" alt="opt_align1"></span>
+ </p>
+<p>
+ This means you can fit twice as many <code class="computeroutput"><span class="keyword">int</span></code>s
+ as <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span></code>s into
+ the same space of memory. Therefore, if the size of the objects is critical
+ for your application (e.g., because you want to utilize your CPU cache in
+ order to gain performance) and you have determined you are willing to trade
+ the code clarity, it is recommended that you simply go with type <code class="computeroutput"><span class="keyword">int</span></code> and use some 'magic value' to represent
+ <span class="emphasis"><em>not-an-int</em></span>.
+ </p>
+<p>
+ Even if you cannot spare any value of <code class="computeroutput"><span class="keyword">int</span></code>
+ to represent <span class="emphasis"><em>not-an-int</em></span> (e.g., because every value is
+ useful, or you do want to signal <span class="emphasis"><em>not-an-int</em></span> explicitly),
+ at least for <code class="computeroutput"><span class="identifier">Trivial</span></code> types
+ you should consider storing the value and the <code class="computeroutput"><span class="keyword">bool</span></code>
+ flag representing the <span class="emphasis"><em>null-state</em></span> separately. Consider
+ the following class:
+ </p>
+<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">Record</span>
+<span class="special">{</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">_min</span><span class="special">;</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">_max</span><span class="special">;</span>
+<span class="special">};</span>
+</pre>
+<p>
+ Its memory layout can be depicted as follows:
+ </p>
+<p>
+ <span class="inlinemediaobject"><img src="../../images/opt_align2.png" alt="opt_align2"></span>
+ </p>
+<p>
+ This is exactly the same as if we had the following members:
+ </p>
+<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">Record</span>
+<span class="special">{</span>
+ <span class="keyword">bool</span> <span class="identifier">_has_min</span><span class="special">;</span>
+ <span class="keyword">int</span> <span class="identifier">_min</span><span class="special">;</span>
+ <span class="keyword">bool</span> <span class="identifier">_has_max</span><span class="special">;</span>
+ <span class="keyword">int</span> <span class="identifier">_max</span><span class="special">;</span>
+<span class="special">};</span>
+</pre>
+<p>
+ But when they are stored separately, we at least have an option to reorder
+ them like this:
+ </p>
+<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">Record</span>
+<span class="special">{</span>
+ <span class="keyword">bool</span> <span class="identifier">_has_min</span><span class="special">;</span>
+ <span class="keyword">bool</span> <span class="identifier">_has_max</span><span class="special">;</span>
+ <span class="keyword">int</span> <span class="identifier">_min</span><span class="special">;</span>
+ <span class="keyword">int</span> <span class="identifier">_max</span><span class="special">;</span>
+<span class="special">};</span>
+</pre>
+<p>
+ Which gives us the following layout (and smaller total size):
+ </p>
+<p>
+ <span class="inlinemediaobject"><img src="../../images/opt_align3.png" alt="opt_align3"></span>
+ </p>
+<p>
+ Sometimes it requires detailed consideration what data we make optional.
+ In our case above, if we determine that both minimum and maximum value can
+ be provided or not provided together, but one is never provided without the
+ other, we can make only one optional memebr:
+ </p>
+<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">Limits</span>
+<span class="special">{</span>
+ <span class="keyword">int</span> <span class="identifier">_min</span><span class="special">;</span>
+ <span class="keyword">int</span> <span class="identifier">_max</span><span class="special">;</span>
+<span class="special">};</span>
+
+<span class="keyword">struct</span> <span class="identifier">Record</span>
+<span class="special">{</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">Limits</span><span class="special">&gt;</span> <span class="identifier">_limits</span><span class="special">;</span>
+<span class="special">};</span>
+</pre>
+<p>
+ This would give us the following layout:
+ </p>
+<p>
+ <span class="inlinemediaobject"><img src="../../images/opt_align4.png" alt="opt_align4"></span>
+ </p>
+<h5>
+<a name="boost_optional.tutorial.performance_considerations.h0"></a>
+ <span class="phrase"><a name="boost_optional.tutorial.performance_considerations.optional_function_parameters"></a></span><a class="link" href="performance_considerations.html#boost_optional.tutorial.performance_considerations.optional_function_parameters">Optional
+ function parameters</a>
+ </h5>
+<p>
+ Having function parameters of type <code class="computeroutput"><span class="keyword">const</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&amp;</span></code>
+ may incur certain unexpected run-time cost connected to copy construction
+ of <code class="computeroutput"><span class="identifier">T</span></code>. Consider the following
+ code.
+ </p>
+<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">fun</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">Big</span><span class="special">&gt;&amp;</span> <span class="identifier">v</span><span class="special">)</span>
+<span class="special">{</span>
+ <span class="keyword">if</span> <span class="special">(</span><span class="identifier">v</span><span class="special">)</span> <span class="identifier">doSomethingWith</span><span class="special">(*</span><span class="identifier">v</span><span class="special">);</span>
+ <span class="keyword">else</span> <span class="identifier">doSomethingElse</span><span class="special">();</span>
+<span class="special">}</span>
+
+<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
+<span class="special">{</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">Big</span><span class="special">&gt;</span> <span class="identifier">ov</span><span class="special">;</span>
+ <span class="identifier">Big</span> <span class="identifier">v</span><span class="special">;</span>
+ <span class="identifier">fun</span><span class="special">(</span><span class="identifier">none</span><span class="special">);</span>
+ <span class="identifier">fun</span><span class="special">(</span><span class="identifier">ov</span><span class="special">);</span> <span class="comment">// no copy</span>
+ <span class="identifier">fun</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span> <span class="comment">// copy constructor of Big</span>
+<span class="special">}</span>
+</pre>
+<p>
+ No copy elision or move semantics can save us from copying type <code class="computeroutput"><span class="identifier">Big</span></code> here. Not that we need any copy, but
+ this is how <code class="computeroutput"><span class="identifier">optional</span></code> works.
+ In order to avoid copying in this case, one could provide second overload
+ of <code class="computeroutput"><span class="identifier">fun</span></code>:
+ </p>
+<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">fun</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Big</span><span class="special">&amp;</span> <span class="identifier">v</span><span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">doSomethingWith</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span>
+<span class="special">}</span>
+
+<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
+<span class="special">{</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">Big</span><span class="special">&gt;</span> <span class="identifier">ov</span><span class="special">;</span>
+ <span class="identifier">Big</span> <span class="identifier">v</span><span class="special">;</span>
+ <span class="identifier">fun</span><span class="special">(</span><span class="identifier">ov</span><span class="special">);</span> <span class="comment">// no copy</span>
+ <span class="identifier">fun</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span> <span class="comment">// no copy: second overload selected</span>
+<span class="special">}</span>
+</pre>
+<p>
+ Alternatively, you could consider using an optional reference instead:
+ </p>
+<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">fun</span><span class="special">(</span><span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">const</span> <span class="identifier">Big</span><span class="special">&amp;&gt;</span> <span class="identifier">v</span><span class="special">)</span> <span class="comment">// note where the reference is</span>
+<span class="special">{</span>
+ <span class="keyword">if</span> <span class="special">(</span><span class="identifier">v</span><span class="special">)</span> <span class="identifier">doSomethingWith</span><span class="special">(*</span><span class="identifier">v</span><span class="special">);</span>
+ <span class="keyword">else</span> <span class="identifier">doSomethingElse</span><span class="special">();</span>
+<span class="special">}</span>
+
+<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
+<span class="special">{</span>
+ <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">Big</span><span class="special">&gt;</span> <span class="identifier">ov</span><span class="special">;</span>
+ <span class="identifier">Big</span> <span class="identifier">v</span><span class="special">;</span>
+ <span class="identifier">fun</span><span class="special">(</span><span class="identifier">none</span><span class="special">);</span>
+ <span class="identifier">fun</span><span class="special">(</span><span class="identifier">ov</span><span class="special">);</span> <span class="comment">// doesn't compile</span>
+ <span class="identifier">fun</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span> <span class="comment">// no copy</span>
+<span class="special">}</span>
+</pre>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014, 2015 Andrzej Krzemie&#324;ski<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="type_requirements.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../optional/tutorial.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../../optional/reference.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
diff --git a/libs/optional/doc/html/boost_optional/tutorial/rebinding_semantics_for_assignment_of_optional_references.html b/libs/optional/doc/html/boost_optional/tutorial/rebinding_semantics_for_assignment_of_optional_references.html
index 26bbf6600..a4c566ffc 100644
--- a/libs/optional/doc/html/boost_optional/tutorial/rebinding_semantics_for_assignment_of_optional_references.html
+++ b/libs/optional/doc/html/boost_optional/tutorial/rebinding_semantics_for_assignment_of_optional_references.html
@@ -135,7 +135,7 @@
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
-<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014 Andrzej Krzemie&#324;ski<p>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014, 2015 Andrzej Krzemie&#324;ski<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>
diff --git a/libs/optional/doc/html/boost_optional/tutorial/relational_operators.html b/libs/optional/doc/html/boost_optional/tutorial/relational_operators.html
index bc97e7b72..31914272a 100644
--- a/libs/optional/doc/html/boost_optional/tutorial/relational_operators.html
+++ b/libs/optional/doc/html/boost_optional/tutorial/relational_operators.html
@@ -7,7 +7,7 @@
<link rel="home" href="../../index.html" title="Boost.Optional">
<link rel="up" href="../../optional/tutorial.html" title="Tutorial">
<link rel="prev" href="when_to_use_optional.html" title="When to use Optional">
-<link rel="next" href="optional_references.html" title="Optional references">
+<link rel="next" href="io_operators.html" title="IO operators">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
@@ -20,7 +20,7 @@
</tr></table>
<hr>
<div class="spirit-nav">
-<a accesskey="p" href="when_to_use_optional.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../optional/tutorial.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="optional_references.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
+<a accesskey="p" href="when_to_use_optional.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../optional/tutorial.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="io_operators.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
@@ -30,7 +30,7 @@
<p>
Type <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code> is
<a href="http://www.sgi.com/tech/stl/EqualityComparable.html" target="_top"><code class="computeroutput"><span class="identifier">EqualityComparable</span></code></a> whenever <code class="computeroutput"><span class="identifier">T</span></code> is <a href="http://www.sgi.com/tech/stl/EqualityComparable.html" target="_top"><code class="computeroutput"><span class="identifier">EqualityComparable</span></code></a>. Two optional
- objects containing a value compare in the same as their contained values.
+ objects containing a value compare in the same way as their contained values.
The uninitialized state of <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code>
is treated as a distinct value, equal to itself, and unequal to any value
of type <code class="computeroutput"><span class="identifier">T</span></code>:
@@ -99,7 +99,7 @@
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
-<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014 Andrzej Krzemie&#324;ski<p>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014, 2015 Andrzej Krzemie&#324;ski<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>
@@ -107,7 +107,7 @@
</tr></table>
<hr>
<div class="spirit-nav">
-<a accesskey="p" href="when_to_use_optional.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../optional/tutorial.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="optional_references.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
+<a accesskey="p" href="when_to_use_optional.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../optional/tutorial.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="io_operators.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>
diff --git a/libs/optional/doc/html/boost_optional/tutorial/type_requirements.html b/libs/optional/doc/html/boost_optional/tutorial/type_requirements.html
index 38a106d16..12cc30a59 100644
--- a/libs/optional/doc/html/boost_optional/tutorial/type_requirements.html
+++ b/libs/optional/doc/html/boost_optional/tutorial/type_requirements.html
@@ -7,7 +7,7 @@
<link rel="home" href="../../index.html" title="Boost.Optional">
<link rel="up" href="../../optional/tutorial.html" title="Tutorial">
<link rel="prev" href="exception_safety_guarantees.html" title="Exception Safety Guarantees">
-<link rel="next" href="../../optional/reference.html" title="Reference">
+<link rel="next" href="performance_considerations.html" title="Performance considerations">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
@@ -20,7 +20,7 @@
</tr></table>
<hr>
<div class="spirit-nav">
-<a accesskey="p" href="exception_safety_guarantees.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../optional/tutorial.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../../optional/reference.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
+<a accesskey="p" href="exception_safety_guarantees.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../optional/tutorial.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="performance_considerations.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
@@ -95,7 +95,7 @@
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
-<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014 Andrzej Krzemie&#324;ski<p>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014, 2015 Andrzej Krzemie&#324;ski<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>
@@ -103,7 +103,7 @@
</tr></table>
<hr>
<div class="spirit-nav">
-<a accesskey="p" href="exception_safety_guarantees.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../optional/tutorial.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../../optional/reference.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
+<a accesskey="p" href="exception_safety_guarantees.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../optional/tutorial.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="performance_considerations.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>
diff --git a/libs/optional/doc/html/boost_optional/tutorial/when_to_use_optional.html b/libs/optional/doc/html/boost_optional/tutorial/when_to_use_optional.html
index 58834461d..fd27d8026 100644
--- a/libs/optional/doc/html/boost_optional/tutorial/when_to_use_optional.html
+++ b/libs/optional/doc/html/boost_optional/tutorial/when_to_use_optional.html
@@ -128,7 +128,7 @@
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
-<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014 Andrzej Krzemie&#324;ski<p>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014, 2015 Andrzej Krzemie&#324;ski<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>
diff --git a/libs/optional/doc/html/images/opt_align1.png b/libs/optional/doc/html/images/opt_align1.png
new file mode 100644
index 000000000..50e0205ea
--- /dev/null
+++ b/libs/optional/doc/html/images/opt_align1.png
Binary files differ
diff --git a/libs/optional/doc/html/images/opt_align2.png b/libs/optional/doc/html/images/opt_align2.png
new file mode 100644
index 000000000..fd7c079c9
--- /dev/null
+++ b/libs/optional/doc/html/images/opt_align2.png
Binary files differ
diff --git a/libs/optional/doc/html/images/opt_align3.png b/libs/optional/doc/html/images/opt_align3.png
new file mode 100644
index 000000000..7ca6ec800
--- /dev/null
+++ b/libs/optional/doc/html/images/opt_align3.png
Binary files differ
diff --git a/libs/optional/doc/html/images/opt_align4.png b/libs/optional/doc/html/images/opt_align4.png
new file mode 100644
index 000000000..c7f9b7242
--- /dev/null
+++ b/libs/optional/doc/html/images/opt_align4.png
Binary files differ
diff --git a/libs/optional/doc/html/index.html b/libs/optional/doc/html/index.html
index 3e4f671a4..891941d8c 100644
--- a/libs/optional/doc/html/index.html
+++ b/libs/optional/doc/html/index.html
@@ -26,7 +26,7 @@
<span class="firstname">Fernando Luis</span> <span class="surname">Cacciola Carballal</span>
</h3></div></div>
<div><p class="copyright">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal</p></div>
-<div><p class="copyright">Copyright &#169; 2014 Andrzej Krzemie&#324;ski</p></div>
+<div><p class="copyright">Copyright &#169; 2014, 2015 Andrzej Krzemie&#324;ski</p></div>
<div><div class="legalnotice">
<a name="optional.legal"></a><p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
@@ -59,6 +59,7 @@
use Optional</a></span></dt>
<dt><span class="section"><a href="boost_optional/tutorial/relational_operators.html">Relational
operators</a></span></dt>
+<dt><span class="section"><a href="boost_optional/tutorial/io_operators.html">IO operators</a></span></dt>
<dt><span class="section"><a href="boost_optional/tutorial/optional_references.html">Optional
references</a></span></dt>
<dt><span class="section"><a href="boost_optional/tutorial/rebinding_semantics_for_assignment_of_optional_references.html">Rebinding
@@ -70,12 +71,22 @@
<dt><span class="section"><a href="boost_optional/tutorial/exception_safety_guarantees.html">Exception
Safety Guarantees</a></span></dt>
<dt><span class="section"><a href="boost_optional/tutorial/type_requirements.html">Type requirements</a></span></dt>
+<dt><span class="section"><a href="boost_optional/tutorial/performance_considerations.html">Performance
+ considerations</a></span></dt>
</dl></dd>
<dt><span class="section"><a href="optional/reference.html">Reference</a></span></dt>
<dd><dl>
-<dt><span class="section"><a href="optional/reference.html#boost_optional.reference.synopsis">Synopsis</a></span></dt>
-<dt><span class="section"><a href="boost_optional/reference/detailed_semantics.html">Detailed
- Semantics</a></span></dt>
+<dt><span class="section"><a href="optional/reference.html#boost_optional.reference.header__boost_none_hpp_">Header
+ &lt;boost/none.hpp&gt;</a></span></dt>
+<dt><span class="section"><a href="boost_optional/reference/header__boost_optional_bad_optional_access_hpp_.html">Header
+ &lt;boost/optional/bad_optional_access.hpp&gt;</a></span></dt>
+<dt><span class="section"><a href="boost_optional/reference/io_header.html">Header &lt;boost/optional/optional_io.hpp&gt;</a></span></dt>
+<dt><span class="section"><a href="boost_optional/reference/header__boost_optional_optional_fwd_hpp_.html">Header
+ &lt;boost/optional/optional_fwd.hpp&gt;</a></span></dt>
+<dt><span class="section"><a href="optional/reference/header__boost_optional_optional_hpp_.html">Header
+ &lt;boost/optional/optional.hpp&gt;</a></span></dt>
+<dt><span class="section"><a href="boost_optional/reference/header__boost_optional_hpp_.html">Header
+ &lt;boost/optional.hpp&gt;</a></span></dt>
</dl></dd>
<dt><span class="section"><a href="boost_optional/dependencies_and_portability.html">Dependencies
and Portability</a></span></dt>
@@ -84,6 +95,7 @@
<dt><span class="section"><a href="boost_optional/dependencies_and_portability/optional_reference_binding.html">Optional
Reference Binding</a></span></dt>
</dl></dd>
+<dt><span class="section"><a href="boost_optional/relnotes.html">Release Notes</a></span></dt>
<dt><span class="section"><a href="boost_optional/acknowledgements.html">Acknowledgements</a></span></dt>
</dl>
</div>
@@ -108,8 +120,9 @@
It is possible that this parameter is not specified; such situation is no error.
It is valid to not specify the parameter and in that case the program is supposed
to behave slightly differently. Also, suppose that any possible value of type
- <code class="computeroutput"><span class="keyword">int</span></code> is a valid value for <code class="computeroutput"><span class="string">"MaxValue"</span></code>, so we cannot jut use <code class="computeroutput"><span class="special">-</span><span class="number">1</span></code> to represent
- the absence of the parameter in the config file.
+ <code class="computeroutput"><span class="keyword">int</span></code> is a valid value for <code class="computeroutput"><span class="string">"MaxValue"</span></code>, so we cannot just use
+ <code class="computeroutput"><span class="special">-</span><span class="number">1</span></code>
+ to represent the absence of the parameter in the config file.
</p>
<h4>
<a name="optional.introduction.h1"></a>
@@ -133,7 +146,7 @@
</div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
-<td align="left"><p><small>Last revised: September 12, 2014 at 09:54:26 GMT</small></p></td>
+<td align="left"><p><small>Last revised: March 13, 2015 at 21:52:15 GMT</small></p></td>
<td align="right"><div class="copyright-footer"></div></td>
</tr></table>
<hr>
diff --git a/libs/optional/doc/html/optional/reference.html b/libs/optional/doc/html/optional/reference.html
index 9c157dfa6..242e029d6 100644
--- a/libs/optional/doc/html/optional/reference.html
+++ b/libs/optional/doc/html/optional/reference.html
@@ -6,8 +6,8 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="../index.html" title="Boost.Optional">
<link rel="up" href="../index.html" title="Boost.Optional">
-<link rel="prev" href="../boost_optional/tutorial/type_requirements.html" title="Type requirements">
-<link rel="next" href="../boost_optional/reference/detailed_semantics.html" title="Detailed Semantics">
+<link rel="prev" href="../boost_optional/tutorial/performance_considerations.html" title="Performance considerations">
+<link rel="next" href="../boost_optional/reference/header__boost_optional_bad_optional_access_hpp_.html" title="Header &lt;boost/optional/bad_optional_access.hpp&gt;">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
@@ -20,160 +20,58 @@
</tr></table>
<hr>
<div class="spirit-nav">
-<a accesskey="p" href="../boost_optional/tutorial/type_requirements.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../boost_optional/reference/detailed_semantics.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
+<a accesskey="p" href="../boost_optional/tutorial/performance_considerations.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../boost_optional/reference/header__boost_optional_bad_optional_access_hpp_.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="optional.reference"></a><a class="link" href="reference.html" title="Reference">Reference</a>
</h2></div></div></div>
<div class="toc"><dl class="toc">
-<dt><span class="section"><a href="reference.html#boost_optional.reference.synopsis">Synopsis</a></span></dt>
-<dt><span class="section"><a href="../boost_optional/reference/detailed_semantics.html">Detailed
- Semantics</a></span></dt>
+<dt><span class="section"><a href="reference.html#boost_optional.reference.header__boost_none_hpp_">Header
+ &lt;boost/none.hpp&gt;</a></span></dt>
+<dt><span class="section"><a href="../boost_optional/reference/header__boost_optional_bad_optional_access_hpp_.html">Header
+ &lt;boost/optional/bad_optional_access.hpp&gt;</a></span></dt>
+<dt><span class="section"><a href="../boost_optional/reference/io_header.html">Header &lt;boost/optional/optional_io.hpp&gt;</a></span></dt>
+<dt><span class="section"><a href="../boost_optional/reference/header__boost_optional_optional_fwd_hpp_.html">Header
+ &lt;boost/optional/optional_fwd.hpp&gt;</a></span></dt>
+<dt><span class="section"><a href="reference/header__boost_optional_optional_hpp_.html">Header
+ &lt;boost/optional/optional.hpp&gt;</a></span></dt>
+<dt><span class="section"><a href="../boost_optional/reference/header__boost_optional_hpp_.html">Header
+ &lt;boost/optional.hpp&gt;</a></span></dt>
</dl></div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
-<a name="boost_optional.reference.synopsis"></a><a class="link" href="reference.html#boost_optional.reference.synopsis" title="Synopsis">Synopsis</a>
+<a name="boost_optional.reference.header__boost_none_hpp_"></a><a class="link" href="reference.html#boost_optional.reference.header__boost_none_hpp_" title="Header &lt;boost/none.hpp&gt;">Header
+ &lt;boost/none.hpp&gt;</a>
</h3></div></div></div>
-<pre class="programlisting"><code class="computeroutput"><span class="comment">// In Header: &lt;</span></code><a href="../../../../../boost/optional/optional.hpp" target="_top">boost/optional/optional.hpp</a><span class="comment">&gt;</span>
-
-<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
-
-<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
-<span class="keyword">class</span> <span class="identifier">optional</span>
-<span class="special">{</span>
- <span class="keyword">public</span> <span class="special">:</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="keyword">noexcept</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/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="keyword">noexcept</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/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">&amp;</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/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">&amp;&amp;</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/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="identifier">optional</span> <span class="special">(</span> <span class="keyword">bool</span> <span class="identifier">condition</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/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">&amp;</span> <span class="identifier">rhs</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/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">&amp;&amp;</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="../boost_optional/reference/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">&lt;</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">&gt;</span> <span class="keyword">explicit</span> <span class="identifier">optional</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rhs</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/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">&lt;</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">&gt;</span> <span class="keyword">explicit</span> <span class="identifier">optional</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">rhs</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/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">&lt;</span><span class="keyword">class</span> <span class="identifier">InPlaceFactory</span><span class="special">&gt;</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">&amp;</span> <span class="identifier">f</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/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">&lt;</span><span class="keyword">class</span> <span class="identifier">TypedInPlaceFactory</span><span class="special">&gt;</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">&amp;</span> <span class="identifier">f</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/detailed_semantics.html#reference_optional_constructor_factory"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
-
- <span class="identifier">optional</span><span class="special">&amp;</span> <span class="keyword">operator</span> <span class="special">=</span> <span class="special">(</span> <span class="identifier">none_t</span> <span class="special">)</span> <span class="keyword">noexcept</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/detailed_semantics.html#reference_optional_operator_equal_none_t"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
-
- <span class="identifier">optional</span><span class="special">&amp;</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">&amp;</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/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">&amp;</span> <span class="keyword">operator</span> <span class="special">=</span> <span class="special">(</span> <span class="identifier">T</span><span class="special">&amp;&amp;</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/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">&amp;</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">&amp;</span> <span class="identifier">rhs</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/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">&amp;</span> <span class="keyword">operator</span> <span class="special">=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span> <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="../boost_optional/reference/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">&lt;</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">&gt;</span> <span class="identifier">optional</span><span class="special">&amp;</span> <span class="keyword">operator</span> <span class="special">=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rhs</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/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">&lt;</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">&gt;</span> <span class="identifier">optional</span><span class="special">&amp;</span> <span class="keyword">operator</span> <span class="special">=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">rhs</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/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">&lt;</span><span class="keyword">class</span><span class="special">...</span> <span class="identifier">Args</span><span class="special">&gt;</span> <span class="keyword">void</span> <span class="identifier">emplace</span> <span class="special">(</span> <span class="identifier">Args</span><span class="special">...&amp;&amp;</span> <span class="identifier">args</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/detailed_semantics.html#reference_optional_emplace"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
-
- <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">InPlaceFactory</span><span class="special">&gt;</span> <span class="identifier">optional</span><span class="special">&amp;</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">&amp;</span> <span class="identifier">f</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/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">&lt;</span><span class="keyword">class</span> <span class="identifier">TypedInPlaceFactory</span><span class="special">&gt;</span> <span class="identifier">optional</span><span class="special">&amp;</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">&amp;</span> <span class="identifier">f</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/detailed_semantics.html#reference_optional_operator_equal_factory"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
-
- <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">get</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/detailed_semantics.html#reference_optional_get"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
- <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">get</span><span class="special">()</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/detailed_semantics.html#reference_optional_get"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
-
- <span class="identifier">T</span> <span class="keyword">const</span><span class="special">*</span> <span class="keyword">operator</span> <span class="special">-&gt;()</span> <span class="keyword">const</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/detailed_semantics.html#reference_optional_operator_arrow"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
- <span class="identifier">T</span><span class="special">*</span> <span class="keyword">operator</span> <span class="special">-&gt;()</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/detailed_semantics.html#reference_optional_operator_arrow"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
-
- <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="keyword">operator</span> <span class="special">*()</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/detailed_semantics.html#reference_optional_operator_asterisk"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
- <span class="identifier">T</span><span class="special">&amp;</span> <span class="keyword">operator</span> <span class="special">*()</span> <span class="special">&amp;</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/detailed_semantics.html#reference_optional_operator_asterisk"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
- <span class="identifier">T</span><span class="special">&amp;&amp;</span> <span class="keyword">operator</span> <span class="special">*()</span> <span class="special">&amp;&amp;</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/detailed_semantics.html#reference_optional_operator_asterisk_move"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
-
- <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">value</span><span class="special">()</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/detailed_semantics.html#reference_optional_value"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
- <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">value</span><span class="special">()</span> <span class="special">&amp;</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/detailed_semantics.html#reference_optional_value"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
- <span class="identifier">T</span><span class="special">&amp;&amp;</span> <span class="identifier">value</span><span class="special">()</span> <span class="special">&amp;&amp;</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/detailed_semantics.html#reference_optional_value_move"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
-
- <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">&gt;</span> <span class="identifier">T</span> <span class="identifier">value_or</span><span class="special">(</span> <span class="identifier">U</span> <span class="special">&amp;&amp;</span> <span class="identifier">v</span> <span class="special">)</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/detailed_semantics.html#reference_optional_value_or"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
- <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">&gt;</span> <span class="identifier">T</span> <span class="identifier">value_or</span><span class="special">(</span> <span class="identifier">U</span> <span class="special">&amp;&amp;</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">&amp;&amp;</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/detailed_semantics.html#reference_optional_value_or_move"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
-
- <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">&gt;</span> <span class="identifier">T</span> <span class="identifier">value_or_eval</span><span class="special">(</span> <span class="identifier">F</span> <span class="identifier">f</span> <span class="special">)</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/detailed_semantics.html#reference_optional_value_or_call"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
- <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">&gt;</span> <span class="identifier">T</span> <span class="identifier">value_or_eval</span><span class="special">(</span> <span class="identifier">F</span> <span class="identifier">f</span> <span class="special">)</span> <span class="special">&amp;&amp;</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/detailed_semantics.html#reference_optional_value_or_call_move"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
-
- <span class="identifier">T</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">get_ptr</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/detailed_semantics.html#reference_optional_get_ptr"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
- <span class="identifier">T</span><span class="special">*</span> <span class="identifier">get_ptr</span><span class="special">()</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/detailed_semantics.html#reference_optional_get_ptr"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
-
- <span class="keyword">explicit</span> <span class="keyword">operator</span> <span class="keyword">bool</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/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="keyword">noexcept</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/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)</span>
- <span class="keyword">void</span> <span class="identifier">reset</span><span class="special">()</span> <span class="keyword">noexcept</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/detailed_semantics.html#reference_optional_reset"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
-
- <span class="comment">// (deprecated)</span>
- <span class="keyword">void</span> <span class="identifier">reset</span> <span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/detailed_semantics.html#reference_optional_reset_value"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
-
- <span class="comment">// (deprecated)</span>
- <span class="keyword">bool</span> <span class="identifier">is_initialized</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/detailed_semantics.html#reference_optional_is_initialized"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
-
- <span class="comment">// (deprecated)</span>
- <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">get_value_or</span><span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="keyword">default</span> <span class="special">)</span> <span class="keyword">const</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/detailed_semantics.html#reference_optional_get_value_or_value"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
-<span class="special">};</span>
-
-<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="keyword">bool</span> <span class="keyword">operator</span> <span class="special">==</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">y</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/detailed_semantics.html#reference_operator_compare_equal_optional_optional"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
-
-<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="keyword">bool</span> <span class="keyword">operator</span> <span class="special">!=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">y</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/detailed_semantics.html#reference_operator_compare_not_equal_optional_optional"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
-
-<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="keyword">bool</span> <span class="keyword">operator</span> <span class="special">&lt;</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">y</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/detailed_semantics.html#reference_operator_compare_less_optional_optional"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
-
-<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="keyword">bool</span> <span class="keyword">operator</span> <span class="special">&gt;</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">y</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/detailed_semantics.html#reference_operator_compare_greater_optional_optional"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
-
-<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="keyword">bool</span> <span class="keyword">operator</span> <span class="special">&lt;=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">y</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/detailed_semantics.html#reference_operator_compare_less_or_equal_optional_optional"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
-
-<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="keyword">bool</span> <span class="keyword">operator</span> <span class="special">&gt;=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">y</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/detailed_semantics.html#reference_operator_compare_greater_or_equal_optional_optional"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
-
-<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="keyword">bool</span> <span class="keyword">operator</span> <span class="special">==</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">none_t</span> <span class="special">)</span> <span class="keyword">noexcept</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/detailed_semantics.html#reference_operator_compare_equal_optional_none"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
-
-<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="keyword">bool</span> <span class="keyword">operator</span> <span class="special">!=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">none_t</span> <span class="special">)</span> <span class="keyword">noexcept</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/detailed_semantics.html#reference_operator_compare_not_equal_optional_none"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
-
-<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">make_optional</span> <span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/detailed_semantics.html#reference_make_optional_value"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
-
-<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">make_optional</span> <span class="special">(</span> <span class="keyword">bool</span> <span class="identifier">condition</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/detailed_semantics.html#reference_make_optional_bool_value"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
-
-<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">get_optional_value_or</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">opt</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="keyword">default</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/detailed_semantics.html#reference_optional_get_value_or_value"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
-
-<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">get</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">opt</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/detailed_semantics.html#reference_optional_get"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
-
-<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">get</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&amp;</span> <span class="identifier">opt</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/detailed_semantics.html#reference_optional_get"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
-
-<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">get</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">opt</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/detailed_semantics.html#reference_optional_get"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
-
-<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="identifier">T</span><span class="special">*</span> <span class="identifier">get</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;*</span> <span class="identifier">opt</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/detailed_semantics.html#reference_optional_get"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
-
-<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">get_pointer</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">opt</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/detailed_semantics.html#reference_optional_get_ptr"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_optional.reference.header__boost_none_hpp_.synopsis"></a><a class="link" href="reference.html#boost_optional.reference.header__boost_none_hpp_.synopsis" title="Synopsis">Synopsis</a>
+</h4></div></div></div>
+<p>
+</p>
+<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
-<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="identifier">T</span><span class="special">*</span> <span class="identifier">get_pointer</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&amp;</span> <span class="identifier">opt</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/detailed_semantics.html#reference_optional_get_ptr"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
+<span class="keyword">class</span> <span class="identifier">none_t</span> <span class="special">{};</span>
-<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&amp;</span> <span class="identifier">y</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../boost_optional/reference/detailed_semantics.html#reference_swap_optional_optional"><span class="inlinemediaobject"><img src="../images/callouts/R.png" alt="R"></span></a>
+<span class="keyword">extern</span> <span class="keyword">const</span> <span class="identifier">none_t</span> <span class="identifier">none</span><span class="special">;</span> <span class="comment">// see below</span>
<span class="special">}</span> <span class="comment">// namespace boost</span>
</pre>
+<p>
+ </p>
+<p>
+ Variable <code class="computeroutput"><span class="identifier">none</span></code> has external
+ linkage, however it is not required to link with any library to obtain
+ its definition. Only by including this header file, the definition becomes
+ available, by means of using template instantiation.
+ </p>
+</div>
</div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
-<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014 Andrzej Krzemie&#324;ski<p>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014, 2015 Andrzej Krzemie&#324;ski<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>
@@ -181,7 +79,7 @@
</tr></table>
<hr>
<div class="spirit-nav">
-<a accesskey="p" href="../boost_optional/tutorial/type_requirements.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../boost_optional/reference/detailed_semantics.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
+<a accesskey="p" href="../boost_optional/tutorial/performance_considerations.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../boost_optional/reference/header__boost_optional_bad_optional_access_hpp_.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>
diff --git a/libs/optional/doc/html/boost_optional/reference/synopsis.html b/libs/optional/doc/html/optional/reference/header__boost_optional_optional_hpp_.html
index 99adcfddd..c5f3e55d5 100644
--- a/libs/optional/doc/html/boost_optional/reference/synopsis.html
+++ b/libs/optional/doc/html/optional/reference/header__boost_optional_optional_hpp_.html
@@ -1,13 +1,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
-<title>Synopsis</title>
+<title>Header &lt;boost/optional/optional.hpp&gt;</title>
<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
-<link rel="home" href="../../index.html" title="Chapter&#160;1.&#160;Boost.Optional">
-<link rel="up" href="../../optional/reference.html" title="Reference">
-<link rel="prev" href="../../optional/reference.html" title="Reference">
-<link rel="next" href="detailed_semantics.html" title="Detailed Semantics">
+<link rel="home" href="../../index.html" title="Boost.Optional">
+<link rel="up" href="../reference.html" title="Reference">
+<link rel="prev" href="../../boost_optional/reference/header__boost_optional_optional_fwd_hpp_.html" title="Header &lt;boost/optional/optional_fwd.hpp&gt;">
+<link rel="next" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html" title="Detailed Semantics">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
@@ -20,147 +20,158 @@
</tr></table>
<hr>
<div class="spirit-nav">
-<a accesskey="p" href="../../optional/reference.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../optional/reference.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="detailed_semantics.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
+<a accesskey="p" href="../../boost_optional/reference/header__boost_optional_optional_fwd_hpp_.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
-<a name="boost_optional.reference.synopsis"></a><a class="link" href="synopsis.html" title="Synopsis">Synopsis</a>
+<a name="optional.reference.header__boost_optional_optional_hpp_"></a><a class="link" href="header__boost_optional_optional_hpp_.html" title="Header &lt;boost/optional/optional.hpp&gt;">Header
+ &lt;boost/optional/optional.hpp&gt;</a>
</h3></div></div></div>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_optional.reference.header__boost_optional_optional_hpp_.header_optional_optional"></a><a name="ref_header_optional_optional_hpp"></a><a class="link" href="header__boost_optional_optional_hpp_.html#boost_optional.reference.header__boost_optional_optional_hpp_.header_optional_optional" title="Synopsis">Synopsis</a>
+</h4></div></div></div>
<pre class="programlisting"><code class="computeroutput"><span class="comment">// In Header: &lt;</span></code><a href="../../../../../../boost/optional/optional.hpp" target="_top">boost/optional/optional.hpp</a><span class="comment">&gt;</span>
<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
-<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
+<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">class</span> <span class="identifier">optional</span>
<span class="special">{</span>
- <span class="keyword">public</span> <span class="special">:</span>
+<span class="keyword">public</span> <span class="special">:</span>
+
+ <span class="keyword">typedef</span> <span class="identifier">T</span> <span class="identifier">value_type</span><span class="special">;</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="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="keyword">noexcept</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/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="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">none_t</span> <span class="special">)</span> <span class="keyword">noexcept</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/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">&amp;</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">&amp;</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/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">&amp;&amp;</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="identifier">optional</span> <span class="special">(</span> <span class="identifier">T</span><span class="special">&amp;&amp;</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/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="identifier">optional</span> <span class="special">(</span> <span class="keyword">bool</span> <span class="identifier">condition</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span> <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">&amp;</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/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">&amp;</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">&amp;</span> <span class="identifier">rhs</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/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">&amp;&amp;</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="identifier">optional</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&amp;&amp;</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="../../boost_optional/reference/header__boost_optional_optional_hpp_/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">&lt;</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">&gt;</span> <span class="keyword">explicit</span> <span class="identifier">optional</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rhs</span> <span class="special">)</span> <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">&lt;</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">&gt;</span> <span class="keyword">explicit</span> <span class="identifier">optional</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rhs</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/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">&lt;</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">&gt;</span> <span class="keyword">explicit</span> <span class="identifier">optional</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;&amp;&amp;</span> <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">&lt;</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">&gt;</span> <span class="keyword">explicit</span> <span class="identifier">optional</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">rhs</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/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">&lt;</span><span class="keyword">class</span> <span class="identifier">InPlaceFactory</span><span class="special">&gt;</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">&amp;</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">&lt;</span><span class="keyword">class</span> <span class="identifier">InPlaceFactory</span><span class="special">&gt;</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">&amp;</span> <span class="identifier">f</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/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">&lt;</span><span class="keyword">class</span> <span class="identifier">TypedInPlaceFactory</span><span class="special">&gt;</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">&amp;</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">&lt;</span><span class="keyword">class</span> <span class="identifier">TypedInPlaceFactory</span><span class="special">&gt;</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">&amp;</span> <span class="identifier">f</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html#reference_optional_constructor_factory"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
- <span class="identifier">optional</span><span class="special">&amp;</span> <span class="keyword">operator</span> <span class="special">=</span> <span class="special">(</span> <span class="identifier">none_t</span> <span class="special">)</span> <span class="keyword">noexcept</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_operator_equal_none_t"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
+ <span class="identifier">optional</span><span class="special">&amp;</span> <span class="keyword">operator</span> <span class="special">=</span> <span class="special">(</span> <span class="identifier">none_t</span> <span class="special">)</span> <span class="keyword">noexcept</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html#reference_optional_operator_equal_none_t"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
- <span class="identifier">optional</span><span class="special">&amp;</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">&amp;</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">&amp;</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">&amp;</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/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">&amp;</span> <span class="keyword">operator</span> <span class="special">=</span> <span class="special">(</span> <span class="identifier">T</span><span class="special">&amp;&amp;</span> <span class="identifier">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">&amp;</span> <span class="keyword">operator</span> <span class="special">=</span> <span class="special">(</span> <span class="identifier">T</span><span class="special">&amp;&amp;</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/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">&amp;</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">&amp;</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">&amp;</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">&amp;</span> <span class="identifier">rhs</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/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">&amp;</span> <span class="keyword">operator</span> <span class="special">=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span> <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="identifier">optional</span><span class="special">&amp;</span> <span class="keyword">operator</span> <span class="special">=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span> <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="../../boost_optional/reference/header__boost_optional_optional_hpp_/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">&lt;</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">&gt;</span> <span class="identifier">optional</span><span class="special">&amp;</span> <span class="keyword">operator</span> <span class="special">=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</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">&lt;</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">&gt;</span> <span class="identifier">optional</span><span class="special">&amp;</span> <span class="keyword">operator</span> <span class="special">=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rhs</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/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">&lt;</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">&gt;</span> <span class="identifier">optional</span><span class="special">&amp;</span> <span class="keyword">operator</span> <span class="special">=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;&amp;&amp;</span> <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">&lt;</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">&gt;</span> <span class="identifier">optional</span><span class="special">&amp;</span> <span class="keyword">operator</span> <span class="special">=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">U</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">rhs</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/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">&lt;</span><span class="keyword">class</span><span class="special">...</span> <span class="identifier">Args</span><span class="special">&gt;</span> <span class="keyword">void</span> <span class="identifier">emplace</span> <span class="special">(</span> <span class="identifier">Args</span><span class="special">...&amp;&amp;</span> <span class="identifier">args</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_emplace"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
+ <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span><span class="special">...</span> <span class="identifier">Args</span><span class="special">&gt;</span> <span class="keyword">void</span> <span class="identifier">emplace</span> <span class="special">(</span> <span class="identifier">Args</span><span class="special">...&amp;&amp;</span> <span class="identifier">args</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html#reference_optional_emplace"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
- <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">InPlaceFactory</span><span class="special">&gt;</span> <span class="identifier">optional</span><span class="special">&amp;</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">&amp;</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">&lt;</span><span class="keyword">class</span> <span class="identifier">InPlaceFactory</span><span class="special">&gt;</span> <span class="identifier">optional</span><span class="special">&amp;</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">&amp;</span> <span class="identifier">f</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/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">&lt;</span><span class="keyword">class</span> <span class="identifier">TypedInPlaceFactory</span><span class="special">&gt;</span> <span class="identifier">optional</span><span class="special">&amp;</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">&amp;</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">&lt;</span><span class="keyword">class</span> <span class="identifier">TypedInPlaceFactory</span><span class="special">&gt;</span> <span class="identifier">optional</span><span class="special">&amp;</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">&amp;</span> <span class="identifier">f</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html#reference_optional_operator_equal_factory"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
- <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">get</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_get"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
- <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">get</span><span class="special">()</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_get"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
+ <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">get</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html#reference_optional_get"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
+ <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">get</span><span class="special">()</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html#reference_optional_get"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
- <span class="identifier">T</span> <span class="keyword">const</span><span class="special">*</span> <span class="keyword">operator</span> <span class="special">-&gt;()</span> <span class="keyword">const</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_operator_arrow"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
- <span class="identifier">T</span><span class="special">*</span> <span class="keyword">operator</span> <span class="special">-&gt;()</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_operator_arrow"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
+ <span class="identifier">T</span> <span class="keyword">const</span><span class="special">*</span> <span class="keyword">operator</span> <span class="special">-&gt;()</span> <span class="keyword">const</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html#reference_optional_operator_arrow"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
+ <span class="identifier">T</span><span class="special">*</span> <span class="keyword">operator</span> <span class="special">-&gt;()</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html#reference_optional_operator_arrow"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
- <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="keyword">operator</span> <span class="special">*()</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_operator_asterisk"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
- <span class="identifier">T</span><span class="special">&amp;</span> <span class="keyword">operator</span> <span class="special">*()</span> <span class="special">&amp;;</span> <a class="link" href="detailed_semantics.html#reference_optional_operator_asterisk"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
- <span class="identifier">T</span><span class="special">&amp;&amp;</span> <span class="keyword">operator</span> <span class="special">*()</span> <span class="special">&amp;&amp;;</span> <a class="link" href="detailed_semantics.html#reference_optional_operator_asterisk"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
+ <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="keyword">operator</span> <span class="special">*()</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html#reference_optional_operator_asterisk"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
+ <span class="identifier">T</span><span class="special">&amp;</span> <span class="keyword">operator</span> <span class="special">*()</span> <span class="special">&amp;</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html#reference_optional_operator_asterisk"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
+ <span class="identifier">T</span><span class="special">&amp;&amp;</span> <span class="keyword">operator</span> <span class="special">*()</span> <span class="special">&amp;&amp;</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html#reference_optional_operator_asterisk_move"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
- <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">value</span><span class="special">()</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_value"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
- <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">value</span><span class="special">()</span> <span class="special">&amp;</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_value"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
- <span class="identifier">T</span><span class="special">&amp;&amp;</span> <span class="identifier">value</span><span class="special">()</span> <span class="special">&amp;&amp;</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_value"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
+ <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">value</span><span class="special">()</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html#reference_optional_value"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
+ <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">value</span><span class="special">()</span> <span class="special">&amp;</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html#reference_optional_value"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
+ <span class="identifier">T</span><span class="special">&amp;&amp;</span> <span class="identifier">value</span><span class="special">()</span> <span class="special">&amp;&amp;</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html#reference_optional_value_move"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
- <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">&gt;</span> <span class="identifier">T</span> <span class="identifier">value_or</span><span class="special">(</span> <span class="identifier">U</span> <span class="special">&amp;&amp;</span> <span class="identifier">v</span> <span class="special">)</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_value_or"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
- <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">&gt;</span> <span class="identifier">T</span> <span class="identifier">value_or</span><span class="special">(</span> <span class="identifier">U</span> <span class="special">&amp;&amp;</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">&amp;&amp;</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_value_or"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
+ <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">&gt;</span> <span class="identifier">T</span> <span class="identifier">value_or</span><span class="special">(</span> <span class="identifier">U</span> <span class="special">&amp;&amp;</span> <span class="identifier">v</span> <span class="special">)</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html#reference_optional_value_or"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
+ <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">&gt;</span> <span class="identifier">T</span> <span class="identifier">value_or</span><span class="special">(</span> <span class="identifier">U</span> <span class="special">&amp;&amp;</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">&amp;&amp;</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html#reference_optional_value_or_move"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
- <span class="identifier">T</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">get_ptr</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_get_ptr"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
- <span class="identifier">T</span><span class="special">*</span> <span class="identifier">get_ptr</span><span class="special">()</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_get_ptr"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
+ <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">&gt;</span> <span class="identifier">T</span> <span class="identifier">value_or_eval</span><span class="special">(</span> <span class="identifier">F</span> <span class="identifier">f</span> <span class="special">)</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html#reference_optional_value_or_call"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
+ <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">&gt;</span> <span class="identifier">T</span> <span class="identifier">value_or_eval</span><span class="special">(</span> <span class="identifier">F</span> <span class="identifier">f</span> <span class="special">)</span> <span class="special">&amp;&amp;</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html#reference_optional_value_or_call_move"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
- <span class="keyword">explicit</span> <span class="keyword">operator</span> <span class="keyword">bool</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="identifier">T</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">get_ptr</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html#reference_optional_get_ptr"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
+ <span class="identifier">T</span><span class="special">*</span> <span class="identifier">get_ptr</span><span class="special">()</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html#reference_optional_get_ptr"><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="keyword">explicit</span> <span class="keyword">operator</span> <span class="keyword">bool</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/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="keyword">noexcept</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/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)</span>
- <span class="keyword">void</span> <span class="identifier">reset</span><span class="special">()</span> <span class="keyword">noexcept</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_reset"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
+ <span class="keyword">void</span> <span class="identifier">reset</span><span class="special">()</span> <span class="keyword">noexcept</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html#reference_optional_reset"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
<span class="comment">// (deprecated)</span>
- <span class="keyword">void</span> <span class="identifier">reset</span> <span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_reset_value"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
+ <span class="keyword">void</span> <span class="identifier">reset</span> <span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html#reference_optional_reset_value"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
<span class="comment">// (deprecated)</span>
- <span class="keyword">bool</span> <span class="identifier">is_initialized</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_is_initialized"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
+ <span class="keyword">bool</span> <span class="identifier">is_initialized</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html#reference_optional_is_initialized"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
<span class="comment">// (deprecated)</span>
- <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">get_value_or</span><span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="keyword">default</span> <span class="special">)</span> <span class="keyword">const</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_get_value_or_value"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
+ <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">get_value_or</span><span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="keyword">default</span> <span class="special">)</span> <span class="keyword">const</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html#reference_optional_get_value_or_value"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
<span class="special">};</span>
-<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="keyword">bool</span> <span class="keyword">operator</span> <span class="special">==</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">y</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_operator_compare_equal_optional_optional"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
+<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="keyword">bool</span> <span class="keyword">operator</span> <span class="special">==</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">y</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html#reference_operator_compare_equal_optional_optional"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
-<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="keyword">bool</span> <span class="keyword">operator</span> <span class="special">!=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">y</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_operator_compare_not_equal_optional_optional"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
+<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="keyword">bool</span> <span class="keyword">operator</span> <span class="special">!=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">y</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html#reference_operator_compare_not_equal_optional_optional"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
-<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="keyword">bool</span> <span class="keyword">operator</span> <span class="special">&lt;</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">y</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_operator_compare_less_optional_optional"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
+<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="keyword">bool</span> <span class="keyword">operator</span> <span class="special">&lt;</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">y</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html#reference_operator_compare_less_optional_optional"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
-<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="keyword">bool</span> <span class="keyword">operator</span> <span class="special">&gt;</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">y</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_operator_compare_greater_optional_optional"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
+<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="keyword">bool</span> <span class="keyword">operator</span> <span class="special">&gt;</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">y</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html#reference_operator_compare_greater_optional_optional"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
-<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="keyword">bool</span> <span class="keyword">operator</span> <span class="special">&lt;=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">y</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_operator_compare_less_or_equal_optional_optional"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
+<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="keyword">bool</span> <span class="keyword">operator</span> <span class="special">&lt;=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">y</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html#reference_operator_compare_less_or_equal_optional_optional"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
-<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="keyword">bool</span> <span class="keyword">operator</span> <span class="special">&gt;=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">y</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_operator_compare_greater_or_equal_optional_optional"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
+<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="keyword">bool</span> <span class="keyword">operator</span> <span class="special">&gt;=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">y</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html#reference_operator_compare_greater_or_equal_optional_optional"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
-<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="keyword">bool</span> <span class="keyword">operator</span> <span class="special">==</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">none_t</span> <span class="special">)</span> <span class="keyword">noexcept</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_operator_compare_equal_optional_none"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
+<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="keyword">bool</span> <span class="keyword">operator</span> <span class="special">==</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">none_t</span> <span class="special">)</span> <span class="keyword">noexcept</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html#reference_operator_compare_equal_optional_none"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
-<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="keyword">bool</span> <span class="keyword">operator</span> <span class="special">!=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">none_t</span> <span class="special">)</span> <span class="keyword">noexcept</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_operator_compare_not_equal_optional_none"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
+<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="keyword">bool</span> <span class="keyword">operator</span> <span class="special">!=</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">none_t</span> <span class="special">)</span> <span class="keyword">noexcept</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html#reference_operator_compare_not_equal_optional_none"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
-<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">make_optional</span> <span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_make_optional_value"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
+<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">make_optional</span> <span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html#reference_make_optional_value"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
-<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">make_optional</span> <span class="special">(</span> <span class="keyword">bool</span> <span class="identifier">condition</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_make_optional_bool_value"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
+<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">make_optional</span> <span class="special">(</span> <span class="keyword">bool</span> <span class="identifier">condition</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">v</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html#reference_make_optional_bool_value"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
-<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">get_optional_value_or</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">opt</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="keyword">default</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_get_value_or_value"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
+<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">get_optional_value_or</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">opt</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="keyword">default</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html#reference_optional_get_value_or_value"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
-<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">get</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">opt</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_get"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
+<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">get</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">opt</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html#reference_optional_get"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
-<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">get</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&amp;</span> <span class="identifier">opt</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_get"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
+<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">get</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&amp;</span> <span class="identifier">opt</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html#reference_optional_get"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
-<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">get</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">opt</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_get"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
+<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">get</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">opt</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html#reference_optional_get"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
-<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="identifier">T</span><span class="special">*</span> <span class="identifier">get</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;*</span> <span class="identifier">opt</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_get"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
+<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="identifier">T</span><span class="special">*</span> <span class="identifier">get</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;*</span> <span class="identifier">opt</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html#reference_optional_get"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
-<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">get_pointer</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">opt</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_get_ptr"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
+<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">get_pointer</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">opt</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html#reference_optional_get_ptr"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
-<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="identifier">T</span><span class="special">*</span> <span class="identifier">get_pointer</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&amp;</span> <span class="identifier">opt</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_optional_get_ptr"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
+<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="identifier">T</span><span class="special">*</span> <span class="identifier">get_pointer</span> <span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&amp;</span> <span class="identifier">opt</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html#reference_optional_get_ptr"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
-<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&amp;</span> <span class="identifier">y</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="detailed_semantics.html#reference_swap_optional_optional"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
+<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">inline</span> <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;&amp;</span> <span class="identifier">y</span> <span class="special">)</span> <span class="special">;</span> <a class="link" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html#reference_swap_optional_optional"><span class="inlinemediaobject"><img src="../../images/callouts/R.png" alt="R"></span></a>
<span class="special">}</span> <span class="comment">// namespace boost</span>
</pre>
</div>
+</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
-<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014 Andrzej Krzemie&#324;ski<p>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014, 2015 Andrzej Krzemie&#324;ski<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>
@@ -168,7 +179,7 @@
</tr></table>
<hr>
<div class="spirit-nav">
-<a accesskey="p" href="../../optional/reference.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../optional/reference.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="detailed_semantics.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
+<a accesskey="p" href="../../boost_optional/reference/header__boost_optional_optional_fwd_hpp_.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../../boost_optional/reference/header__boost_optional_optional_hpp_/detailed_semantics.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>
diff --git a/libs/optional/doc/html/optional/tutorial.html b/libs/optional/doc/html/optional/tutorial.html
index 7b84efd9c..537a8b09e 100644
--- a/libs/optional/doc/html/optional/tutorial.html
+++ b/libs/optional/doc/html/optional/tutorial.html
@@ -33,6 +33,7 @@
use Optional</a></span></dt>
<dt><span class="section"><a href="../boost_optional/tutorial/relational_operators.html">Relational
operators</a></span></dt>
+<dt><span class="section"><a href="../boost_optional/tutorial/io_operators.html">IO operators</a></span></dt>
<dt><span class="section"><a href="../boost_optional/tutorial/optional_references.html">Optional
references</a></span></dt>
<dt><span class="section"><a href="../boost_optional/tutorial/rebinding_semantics_for_assignment_of_optional_references.html">Rebinding
@@ -44,6 +45,8 @@
<dt><span class="section"><a href="../boost_optional/tutorial/exception_safety_guarantees.html">Exception
Safety Guarantees</a></span></dt>
<dt><span class="section"><a href="../boost_optional/tutorial/type_requirements.html">Type requirements</a></span></dt>
+<dt><span class="section"><a href="../boost_optional/tutorial/performance_considerations.html">Performance
+ considerations</a></span></dt>
</dl></div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
@@ -139,7 +142,7 @@
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
-<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014 Andrzej Krzemie&#324;ski<p>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2003-2007 Fernando Luis Cacciola Carballal<br>Copyright &#169; 2014, 2015 Andrzej Krzemie&#324;ski<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>
diff --git a/libs/optional/doc/images/opt_align1.png b/libs/optional/doc/images/opt_align1.png
new file mode 100644
index 000000000..50e0205ea
--- /dev/null
+++ b/libs/optional/doc/images/opt_align1.png
Binary files differ
diff --git a/libs/optional/doc/images/opt_align2.png b/libs/optional/doc/images/opt_align2.png
new file mode 100644
index 000000000..fd7c079c9
--- /dev/null
+++ b/libs/optional/doc/images/opt_align2.png
Binary files differ
diff --git a/libs/optional/doc/images/opt_align3.png b/libs/optional/doc/images/opt_align3.png
new file mode 100644
index 000000000..7ca6ec800
--- /dev/null
+++ b/libs/optional/doc/images/opt_align3.png
Binary files differ
diff --git a/libs/optional/doc/images/opt_align4.png b/libs/optional/doc/images/opt_align4.png
new file mode 100644
index 000000000..c7f9b7242
--- /dev/null
+++ b/libs/optional/doc/images/opt_align4.png
Binary files differ
diff --git a/libs/optional/meta/libraries.json b/libs/optional/meta/libraries.json
index f40ada799..4bdac3126 100644
--- a/libs/optional/meta/libraries.json
+++ b/libs/optional/meta/libraries.json
@@ -1,12 +1,13 @@
{
"key": "optional",
+ "boost-version": "1.30.0",
"name": "Optional",
"authors": [
"Fernando Cacciola"
],
- "description": "Discriminated-union wrapper for optional values.",
+ "description": "A value-semantic, type-safe wrapper for representing 'optional' (or 'nullable') objects of a given type. An optional object may or may not contain a value of the underlying type.",
"category": [
- "Miscellaneous"
+ "Data structures"
],
"maintainers": [
"Fernando Cacciola <fernando_cacciola -at- ciudad.com.ar>",
diff --git a/libs/optional/test/Jamfile.v2 b/libs/optional/test/Jamfile.v2
index aeb0900fa..d654545fc 100644
--- a/libs/optional/test/Jamfile.v2
+++ b/libs/optional/test/Jamfile.v2
@@ -17,15 +17,27 @@ import testing ;
{
test-suite optional :
[ run optional_test.cpp ]
+ [ run optional_test_swap.cpp ]
+ [ run optional_test_conversions_from_U.cpp ]
[ run optional_test_tie.cpp ]
- [ run optional_test_ref.cpp ]
- [ run optional_test_inplace.cpp ]
+ [ run optional_test_ref_assign_portable_minimum.cpp ]
+ [ run optional_test_ref_assign_mutable_int.cpp ]
+ [ run optional_test_ref_assign_const_int.cpp ]
+ [ run optional_test_ref_converting_ctor.cpp ]
+ [ run optional_test_ref_convert_assign_non_int.cpp ]
+ [ run optional_test_ref_convert_assign_mutable_int.cpp ]
+ [ run optional_test_ref_convert_assign_const_int.cpp ]
+ [ run optional_test_ref_portable_minimum.cpp ]
+ [ run optional_test_ref_move.cpp ]
+ [ run optional_test_inplace_factory.cpp ]
[ run optional_test_io.cpp ]
[ run optional_test_move.cpp ]
+ [ run optional_test_noexcept_move.cpp ]
[ run optional_test_equals_none.cpp ]
[ run optional_test_value_access.cpp ]
[ run optional_test_emplace.cpp ]
[ run optional_test_minimum_requirements.cpp ]
+ [ run optional_test_msvc_bug_workaround.cpp ]
[ compile-fail optional_test_fail1.cpp ]
[ compile-fail optional_test_fail3a.cpp ]
[ compile-fail optional_test_fail3b.cpp ]
@@ -41,7 +53,10 @@ import testing ;
[ compile-fail optional_test_ref_fail_init_from_Urefref.cpp ]
[ compile-fail optional_test_ref_fail_assign_from_Trefref.cpp ]
[ compile-fail optional_test_ref_fail_assign_from_Urefref.cpp ]
+ [ compile-fail optional_test_fail_convert_from_null.cpp ]
[ compile-fail optional_test_fail_explicit_convert_in_value_or.cpp ]
[ compile-fail optional_test_fail_explicit_convert_in_value_or_call.cpp ]
+ [ compile-fail optional_test_fail_io_without_io.cpp ]
+ [ compile-fail optional_test_fail_convert_assign_of_enums.cpp ]
;
}
diff --git a/libs/optional/test/optional_ref_assign_test_defs.hpp b/libs/optional/test/optional_ref_assign_test_defs.hpp
new file mode 100644
index 000000000..292d0fc35
--- /dev/null
+++ b/libs/optional/test/optional_ref_assign_test_defs.hpp
@@ -0,0 +1,197 @@
+// Copyright (C) 2014 Andrzej Krzemienski.
+//
+// Use, modification, and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/lib/optional for documentation.
+//
+// You are welcome to contact the author at: akrzemi1@gmail.com
+
+#ifndef BOOST_OPTIONAL_TEST_OPTIONAL_REF_ASSIGN_TEST_DEFS_AK_07JAN2015_HPP
+#define BOOST_OPTIONAL_TEST_OPTIONAL_REF_ASSIGN_TEST_DEFS_AK_07JAN2015_HPP
+
+#include "boost/optional/optional.hpp"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+#include "boost/core/addressof.hpp"
+#include "testable_classes.hpp"
+
+using boost::optional;
+using boost::none;
+using boost::addressof;
+
+template <typename T>
+void test_copy_assignment_for_const()
+{
+ const typename concrete_type_of<T>::type v(2);
+ optional<const T&> o;
+ o = optional<const T&>(v);
+
+ BOOST_TEST(o);
+ BOOST_TEST(o != none);
+ BOOST_TEST(addressof(*o) == addressof(v));
+ BOOST_TEST(val(*o) == val(v));
+ BOOST_TEST(val(*o) == 2);
+}
+
+template <typename T>
+void test_copy_assignment_for_noconst_const()
+{
+ typename concrete_type_of<T>::type v(2);
+ optional<const T&> o;
+ o = optional<const T&>(v);
+
+ BOOST_TEST(o);
+ BOOST_TEST(o != none);
+ BOOST_TEST(addressof(*o) == addressof(v));
+ BOOST_TEST(val(*o) == val(v));
+ BOOST_TEST(val(*o) == 2);
+
+ val(v) = 9;
+ BOOST_TEST(addressof(*o) == addressof(v));
+ BOOST_TEST_EQ(val(*o), val(v));
+ BOOST_TEST_EQ(val(*o), 9);
+ BOOST_TEST_EQ(val(v), 9);
+}
+
+template <typename T>
+void test_copy_assignment_for()
+{
+ typename concrete_type_of<T>::type v(2);
+ optional<T&> o;
+ o = optional<T&>(v);
+
+ BOOST_TEST(o);
+ BOOST_TEST(o != none);
+ BOOST_TEST(addressof(*o) == addressof(v));
+ BOOST_TEST(val(*o) == val(v));
+ BOOST_TEST(val(*o) == 2);
+
+ val(v) = 9;
+ BOOST_TEST(addressof(*o) == addressof(v));
+ BOOST_TEST_EQ(val(*o), val(v));
+ BOOST_TEST_EQ(val(*o), 9);
+ BOOST_TEST_EQ(val(v), 9);
+
+ val(*o) = 7;
+ BOOST_TEST(addressof(*o) == addressof(v));
+ BOOST_TEST_EQ(val(*o), val(v));
+ BOOST_TEST_EQ(val(*o), 7);
+ BOOST_TEST_EQ(val(v), 7);
+}
+
+template <typename T>
+void test_rebinding_assignment_semantics_const()
+{
+ const typename concrete_type_of<T>::type v(2), w(7);
+ optional<const T&> o(v);
+
+ BOOST_TEST(o);
+ BOOST_TEST(addressof(*o) == addressof(v));
+ BOOST_TEST_EQ(val(*o), val(v));
+ BOOST_TEST_EQ(val(*o), 2);
+
+ o = optional<const T&>(w);
+ BOOST_TEST_EQ(val(v), 2);
+
+ BOOST_TEST(o);
+ BOOST_TEST(addressof(*o) != addressof(v));
+ BOOST_TEST_NE(val(*o), val(v));
+ BOOST_TEST_NE(val(*o), 2);
+
+ BOOST_TEST(addressof(*o) == addressof(w));
+ BOOST_TEST_EQ(val(*o), val(w));
+ BOOST_TEST_EQ(val(*o), 7);
+}
+
+template <typename T>
+void test_rebinding_assignment_semantics_noconst_const()
+{
+ typename concrete_type_of<T>::type v(2), w(7);
+ optional<const T&> o(v);
+
+ BOOST_TEST(o);
+ BOOST_TEST(addressof(*o) == addressof(v));
+ BOOST_TEST_EQ(val(*o), val(v));
+ BOOST_TEST_EQ(val(*o), 2);
+
+ o = optional<const T&>(w);
+ BOOST_TEST_EQ(val(v), 2);
+
+ BOOST_TEST(o);
+ BOOST_TEST(addressof(*o) != addressof(v));
+ BOOST_TEST_NE(val(*o), val(v));
+ BOOST_TEST_NE(val(*o), 2);
+
+ BOOST_TEST(addressof(*o) == addressof(w));
+ BOOST_TEST_EQ(val(*o), val(w));
+ BOOST_TEST_EQ(val(*o), 7);
+}
+
+template <typename T>
+void test_rebinding_assignment_semantics()
+{
+ typename concrete_type_of<T>::type v(2), w(7);
+ optional<T&> o(v);
+
+ BOOST_TEST(o);
+ BOOST_TEST(addressof(*o) == addressof(v));
+ BOOST_TEST_EQ(val(*o), val(v));
+ BOOST_TEST_EQ(val(*o), 2);
+
+ o = optional<T&>(w);
+ BOOST_TEST_EQ(val(v), 2);
+
+ BOOST_TEST(o);
+ BOOST_TEST(addressof(*o) != addressof(v));
+ BOOST_TEST_NE(val(*o), val(v));
+ BOOST_TEST_NE(val(*o), 2);
+
+ BOOST_TEST(addressof(*o) == addressof(w));
+ BOOST_TEST_EQ(val(*o), val(w));
+ BOOST_TEST_EQ(val(*o), 7);
+
+ val(*o) = 8;
+ BOOST_TEST(addressof(*o) == addressof(w));
+ BOOST_TEST_EQ(val(*o), val(w));
+ BOOST_TEST_EQ(val(*o), 8);
+ BOOST_TEST_EQ(val(w), 8);
+ BOOST_TEST_EQ(val(v), 2);
+}
+
+template <typename T>
+void test_converting_assignment()
+{
+ typename concrete_type_of<T>::type v1(1), v2(2), v3(3);
+ optional<T&> oA(v1), oB(none);
+
+ oA = v2;
+ BOOST_TEST(oA);
+ BOOST_TEST(addressof(*oA) == addressof(v2));
+
+ oB = v3;
+ BOOST_TEST(oB);
+ BOOST_TEST(addressof(*oB) == addressof(v3));
+}
+
+template <typename T>
+void test_converting_assignment_for_noconst_const()
+{
+ typename concrete_type_of<T>::type v1(1), v2(2), v3(3);
+ optional<const T&> oA(v1), oB(none);
+
+ oA = v2;
+ BOOST_TEST(oA);
+ BOOST_TEST(addressof(*oA) == addressof(v2));
+
+ oB = v3;
+ BOOST_TEST(oB);
+ BOOST_TEST(addressof(*oB) == addressof(v3));
+}
+
+#endif //BOOST_OPTIONAL_TEST_OPTIONAL_REF_ASSIGN_TEST_DEFS_AK_07JAN2015_HPP
+
diff --git a/libs/optional/test/optional_test.cpp b/libs/optional/test/optional_test.cpp
index e34ce7e23..359186741 100644
--- a/libs/optional/test/optional_test.cpp
+++ b/libs/optional/test/optional_test.cpp
@@ -906,372 +906,6 @@ void test_no_implicit_conversions()
test_no_implicit_conversions_impl(p);
}
-struct A {} ;
-void test_conversions1()
-{
- TRACE( std::endl << BOOST_CURRENT_FUNCTION );
-
-#ifndef BOOST_OPTIONAL_NO_CONVERTING_COPY_CTOR
- char c = 20 ;
- optional<char> opt0(c);
- optional<int> opt1(opt0);
- BOOST_CHECK(*opt1 == static_cast<int>(c));
-#endif
-
-#ifndef BOOST_OPTIONAL_NO_CONVERTING_ASSIGNMENT
- float f = 21.22f ;
- double d = f ;
- optional<float> opt2(f) ;
- optional<double> opt3 ;
- opt3 = opt2 ;
- BOOST_CHECK(*opt3 == d);
-#endif
-}
-
-void test_conversions2()
-{
- TRACE( std::endl << BOOST_CURRENT_FUNCTION );
-
- char c = 20 ;
- optional<int> opt(c);
- BOOST_CHECK( get(opt) == static_cast<int>(c));
-
- float f = 21.22f ;
- optional<double> opt1;
- opt1 = f ;
- BOOST_CHECK(*get(&opt1) == static_cast<double>(f));
-}
-
-
-namespace optional_swap_test
-{
- class default_ctor_exception : public std::exception {} ;
- class copy_ctor_exception : public std::exception {} ;
- class assignment_exception : public std::exception {} ;
-
- //
- // Base class for swap test classes. Its assignment should not be called, when swapping
- // optional<T> objects. (The default std::swap would do so.)
- //
- class base_class_with_forbidden_assignment
- {
- public:
- base_class_with_forbidden_assignment & operator=(const base_class_with_forbidden_assignment &)
- {
- BOOST_CHECK(!"The assignment should not be used while swapping!");
- throw assignment_exception();
- }
-
- virtual ~base_class_with_forbidden_assignment() {}
- };
-
- //
- // Class without default constructor
- //
- class class_without_default_ctor : public base_class_with_forbidden_assignment
- {
- public:
- char data;
- explicit class_without_default_ctor(char arg) : data(arg) {}
- };
-
- //
- // Class whose default constructor should not be used by optional::swap!
- //
- class class_whose_default_ctor_should_not_be_used : public base_class_with_forbidden_assignment
- {
- public:
- char data;
- explicit class_whose_default_ctor_should_not_be_used(char arg) : data(arg) {}
-
- class_whose_default_ctor_should_not_be_used()
- {
- BOOST_CHECK(!"This default constructor should not be used while swapping!");
- throw default_ctor_exception();
- }
- };
-
- //
- // Class whose default constructor should be used by optional::swap.
- // Its copy constructor should be avoided!
- //
- class class_whose_default_ctor_should_be_used : public base_class_with_forbidden_assignment
- {
- public:
- char data;
- explicit class_whose_default_ctor_should_be_used(char arg) : data(arg) { }
-
- class_whose_default_ctor_should_be_used() : data('\0') { }
-
- class_whose_default_ctor_should_be_used(const class_whose_default_ctor_should_be_used &)
- {
- BOOST_CHECK(!"This copy constructor should not be used while swapping!");
- throw copy_ctor_exception();
- }
- };
-
- //
- // Class template whose default constructor should be used by optional::swap.
- // Its copy constructor should be avoided!
- //
- template <class T>
- class template_whose_default_ctor_should_be_used : public base_class_with_forbidden_assignment
- {
- public:
- T data;
- explicit template_whose_default_ctor_should_be_used(T arg) : data(arg) { }
-
- template_whose_default_ctor_should_be_used() : data('\0') { }
-
- template_whose_default_ctor_should_be_used(const template_whose_default_ctor_should_be_used &)
- {
- BOOST_CHECK(!"This copy constructor should not be used while swapping!");
- throw copy_ctor_exception();
- }
- };
-
- //
- // Class whose explicit constructor should be used by optional::swap.
- // Its other constructors should be avoided!
- //
- class class_whose_explicit_ctor_should_be_used : public base_class_with_forbidden_assignment
- {
- public:
- char data;
- explicit class_whose_explicit_ctor_should_be_used(char arg) : data(arg) { }
-
- class_whose_explicit_ctor_should_be_used()
- {
- BOOST_CHECK(!"This default constructor should not be used while swapping!");
- throw default_ctor_exception();
- }
-
- class_whose_explicit_ctor_should_be_used(const class_whose_explicit_ctor_should_be_used &)
- {
- BOOST_CHECK(!"This copy constructor should not be used while swapping!");
- throw copy_ctor_exception();
- }
- };
-
- void swap(class_whose_default_ctor_should_not_be_used & lhs, class_whose_default_ctor_should_not_be_used & rhs)
- {
- std::swap(lhs.data, rhs.data);
- }
-
- void swap(class_whose_default_ctor_should_be_used & lhs, class_whose_default_ctor_should_be_used & rhs)
- {
- std::swap(lhs.data, rhs.data);
- }
-
- void swap(class_without_default_ctor & lhs, class_without_default_ctor & rhs)
- {
- std::swap(lhs.data, rhs.data);
- }
-
- void swap(class_whose_explicit_ctor_should_be_used & lhs, class_whose_explicit_ctor_should_be_used & rhs)
- {
- std::swap(lhs.data, rhs.data);
- }
-
- template <class T>
- void swap(template_whose_default_ctor_should_be_used<T> & lhs, template_whose_default_ctor_should_be_used<T> & rhs)
- {
- std::swap(lhs.data, rhs.data);
- }
-
- //
- // optional<T>::swap should be customized when neither the copy constructor
- // nor the default constructor of T are supposed to be used when swapping, e.g.,
- // for the following type T = class_whose_explicit_ctor_should_be_used.
- //
- void swap(boost::optional<class_whose_explicit_ctor_should_be_used> & x, boost::optional<class_whose_explicit_ctor_should_be_used> & y)
- {
- bool hasX(x);
- bool hasY(y);
-
- if ( !hasX && !hasY )
- return;
-
- if( !hasX )
- x = boost::in_place('\0');
- else if ( !hasY )
- y = boost::in_place('\0');
-
- optional_swap_test::swap(*x,*y);
-
- if( !hasX )
- y = boost::none ;
- else if( !hasY )
- x = boost::none ;
- }
-
-
-} // End of namespace optional_swap_test.
-
-
-namespace boost {
-
-//
-// Compile time tweaking on whether or not swap should use the default constructor:
-//
-
-template <> struct optional_swap_should_use_default_constructor<
- optional_swap_test::class_whose_default_ctor_should_be_used> : mpl::true_ {} ;
-
-template <> struct optional_swap_should_use_default_constructor<
- optional_swap_test::class_whose_default_ctor_should_not_be_used> : mpl::false_ {} ;
-
-template <class T> struct optional_swap_should_use_default_constructor<
- optional_swap_test::template_whose_default_ctor_should_be_used<T> > : mpl::true_ {} ;
-
-
-//
-// Specialization of boost::swap:
-//
-template <>
-void swap(optional<optional_swap_test::class_whose_explicit_ctor_should_be_used> & x, optional<optional_swap_test::class_whose_explicit_ctor_should_be_used> & y)
-{
- optional_swap_test::swap(x, y);
-}
-
-} // namespace boost
-
-
-namespace std {
-
-//
-// Specializations of std::swap:
-//
-
-template <>
-void swap(optional_swap_test::class_whose_default_ctor_should_be_used & x, optional_swap_test::class_whose_default_ctor_should_be_used & y)
-{
- optional_swap_test::swap(x, y);
-}
-
-template <>
-void swap(optional_swap_test::class_whose_default_ctor_should_not_be_used & x, optional_swap_test::class_whose_default_ctor_should_not_be_used & y)
-{
- optional_swap_test::swap(x, y);
-}
-
-template <>
-void swap(optional_swap_test::class_without_default_ctor & x, optional_swap_test::class_without_default_ctor & y)
-{
- optional_swap_test::swap(x, y);
-}
-
-template <>
-void swap(optional_swap_test::class_whose_explicit_ctor_should_be_used & x, optional_swap_test::class_whose_explicit_ctor_should_be_used & y)
-{
- optional_swap_test::swap(x, y);
-}
-
-} // namespace std
-
-
-//
-// Tests whether the swap function works properly for optional<T>.
-// Assumes that T has one data member, of type char.
-// Returns true iff the test is passed.
-//
-template <class T>
-bool test_swap_function( T const* )
-{
- const boost::unit_test::counter_t counter_before_test = boost::minimal_test::errors_counter();
- try
- {
- optional<T> obj1;
- optional<T> obj2('a');
-
- // Self-swap should not have any effect.
- swap(obj1, obj1);
- swap(obj2, obj2);
- BOOST_CHECK(!obj1);
- BOOST_CHECK(!!obj2 && obj2->data == 'a');
-
- // Call non-member swap.
- swap(obj1, obj2);
-
- // Test if obj1 and obj2 are really swapped.
- BOOST_CHECK(!!obj1 && obj1->data == 'a');
- BOOST_CHECK(!obj2);
-
- // Call non-member swap one more time.
- swap(obj1, obj2);
-
- // Test if obj1 and obj2 are swapped back.
- BOOST_CHECK(!obj1);
- BOOST_CHECK(!!obj2 && obj2->data == 'a');
- }
- catch(const std::exception &)
- {
- // The swap function should not throw, for our test cases.
- return false ;
- }
- return boost::minimal_test::errors_counter() == counter_before_test ;
-}
-
-//
-// Tests whether the optional<T>::swap member function works properly.
-// Assumes that T has one data member, of type char.
-// Returns true iff the test is passed.
-//
-template <class T>
-bool test_swap_member_function( T const* )
-{
- const boost::unit_test::counter_t counter_before_test = boost::minimal_test::errors_counter();
- try
- {
- optional<T> obj1;
- optional<T> obj2('a');
-
- // Self-swap should not have any effect.
- obj1.swap(obj1);
- obj2.swap(obj2);
- BOOST_CHECK(!obj1);
- BOOST_CHECK(!!obj2 && obj2->data == 'a');
-
- // Call member swap.
- obj1.swap(obj2);
-
- // Test if obj1 and obj2 are really swapped.
- BOOST_CHECK(!!obj1 && obj1->data == 'a');
- BOOST_CHECK(!obj2);
-
- // Call member swap one more time.
- obj1.swap(obj2);
-
- // Test if obj1 and obj2 are swapped back.
- BOOST_CHECK(!obj1);
- BOOST_CHECK(!!obj2 && obj2->data == 'a');
- }
- catch(const std::exception &)
- {
- // The optional<T>::swap member function should not throw, for our test cases.
- return false ;
- }
- return boost::minimal_test::errors_counter() == counter_before_test ;
-}
-
-
-//
-// Tests compile time tweaking of swap, by means of
-// optional_swap_should_use_default_constructor.
-//
-void test_swap_tweaking()
-{
- BOOST_CHECK( test_swap_function( ARG(optional_swap_test::class_without_default_ctor) ) );
- BOOST_CHECK( test_swap_function( ARG(optional_swap_test::class_whose_default_ctor_should_be_used) ) );
- BOOST_CHECK( test_swap_function( ARG(optional_swap_test::class_whose_default_ctor_should_not_be_used) ) );
- BOOST_CHECK( test_swap_function( ARG(optional_swap_test::class_whose_explicit_ctor_should_be_used) ) );
- BOOST_CHECK( test_swap_function( ARG(optional_swap_test::template_whose_default_ctor_should_be_used<char>) ) );
- BOOST_CHECK( test_swap_member_function( ARG(optional_swap_test::class_without_default_ctor) ) );
- BOOST_CHECK( test_swap_member_function( ARG(optional_swap_test::class_whose_default_ctor_should_be_used) ) );
- BOOST_CHECK( test_swap_member_function( ARG(optional_swap_test::class_whose_default_ctor_should_not_be_used) ) );
- BOOST_CHECK( test_swap_member_function( ARG(optional_swap_test::class_whose_explicit_ctor_should_be_used) ) );
- BOOST_CHECK( test_swap_member_function( ARG(optional_swap_test::template_whose_default_ctor_should_be_used<char>) ) );
-}
// Test for support for classes with overridden operator&
class CustomAddressOfClass
@@ -1307,9 +941,6 @@ int test_main( int, char* [] )
test_with_class_type();
test_with_builtin_types();
test_no_implicit_conversions();
- test_conversions1();
- test_conversions2();
- test_swap_tweaking();
test_custom_addressof_operator();
}
catch ( ... )
diff --git a/libs/optional/test/optional_test_common.cpp b/libs/optional/test/optional_test_common.cpp
index 532b74e7a..a527bd715 100644
--- a/libs/optional/test/optional_test_common.cpp
+++ b/libs/optional/test/optional_test_common.cpp
@@ -51,6 +51,8 @@ using boost::get_pointer ;
// via the safe_bool operator.
#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1300) ) // 1300 == VC++ 7.1
#define BOOST_OPTIONAL_NO_NULL_COMPARE
+#else
+#define BOOST_OPTIONAL_NO_NULL_COMPARE // Andrzej: I also disable 0 comparison everywhere
#endif
#define ARG(T) (static_cast< T const* >(0))
diff --git a/libs/optional/test/optional_test_conversions_from_U.cpp b/libs/optional/test/optional_test_conversions_from_U.cpp
new file mode 100644
index 000000000..57d821577
--- /dev/null
+++ b/libs/optional/test/optional_test_conversions_from_U.cpp
@@ -0,0 +1,111 @@
+// Copyright (C) 2014 Andrzej Krzemienski.
+//
+// Use, modification, and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/lib/optional for documentation.
+//
+// You are welcome to contact the author at: akrzemi1@gmail.com
+
+
+#include "boost/optional/optional.hpp"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+#include "boost/core/lightweight_test.hpp"
+
+using boost::optional;
+
+
+// testing types:
+// X is convertible to Y
+// ADeriv is convertible to ABase
+struct X
+{
+ int val;
+ explicit X(int v) : val(v) {}
+};
+
+struct Y
+{
+ int yval;
+ Y(X const& x) : yval(x.val) {}
+ friend bool operator==(Y const& l, Y const& r) { return l.yval == r.yval; }
+};
+
+struct ABase
+{
+ int val;
+ explicit ABase(int v) : val(v) {}
+ friend bool operator==(ABase const& l, ABase const& r) { return l.val == r.val; }
+};
+
+struct ADeriv : ABase
+{
+ explicit ADeriv(int v) : ABase(v) {}
+};
+
+
+template <typename T, typename U>
+void test_convert_optional_U_to_optional_T_for()
+{
+#ifndef BOOST_OPTIONAL_NO_CONVERTING_COPY_CTOR
+ {
+ optional<U> ou(U(8));
+ optional<T> ot1(ou);
+ BOOST_TEST(ot1);
+ BOOST_TEST(*ot1 == T(*ou));
+ }
+#endif
+
+#ifndef BOOST_OPTIONAL_NO_CONVERTING_ASSIGNMENT
+ {
+ optional<U> ou(U(8));
+ optional<T> ot2;
+ ot2 = ou;
+ BOOST_TEST(ot2);
+ BOOST_TEST(*ot2 == T(*ou));
+ }
+#endif
+}
+
+void test_convert_optional_U_to_optional_T()
+{
+ test_convert_optional_U_to_optional_T_for<Y, X>();
+ test_convert_optional_U_to_optional_T_for<ABase, ADeriv>();
+ test_convert_optional_U_to_optional_T_for<long, short>();
+ test_convert_optional_U_to_optional_T_for<double, float>();
+}
+
+template <typename T, typename U>
+void test_convert_U_to_optional_T_for()
+{
+ U u(8);
+ optional<T> ot1(u);
+ BOOST_TEST(ot1);
+ BOOST_TEST(*ot1 == T(u));
+
+ optional<T> ot2;
+ ot2 = u;
+ BOOST_TEST(ot2);
+ BOOST_TEST(*ot2 == T(u));
+}
+
+void test_convert_U_to_optional_T()
+{
+ test_convert_U_to_optional_T_for<Y, X>();
+ test_convert_U_to_optional_T_for<ABase, ADeriv>();
+ test_convert_U_to_optional_T_for<long, short>();
+ test_convert_U_to_optional_T_for<double, float>();
+}
+
+int main()
+{
+ test_convert_optional_U_to_optional_T();
+ test_convert_U_to_optional_T();
+
+ return boost::report_errors();
+}
diff --git a/libs/optional/test/optional_test_emplace.cpp b/libs/optional/test/optional_test_emplace.cpp
index b55c1ebad..117f26ca3 100644
--- a/libs/optional/test/optional_test_emplace.cpp
+++ b/libs/optional/test/optional_test_emplace.cpp
@@ -8,19 +8,6 @@
//
// You are welcome to contact the author at:
// akrzemi1@gmail.com
-//
-// Revisions:
-//
-#include<iostream>
-#include<stdexcept>
-#include<string>
-
-#define BOOST_ENABLE_ASSERT_HANDLER
-
-#include "boost/bind/apply.hpp" // Included just to test proper interaction with boost::apply<> as reported by Daniel Wallin
-#include "boost/mpl/bool.hpp"
-#include "boost/mpl/bool_fwd.hpp" // For mpl::true_ and mpl::false_
-#include "boost/static_assert.hpp"
#include "boost/optional/optional.hpp"
@@ -28,15 +15,15 @@
#pragma hdrstop
#endif
+#include "boost/core/lightweight_test.hpp"
#include "boost/none.hpp"
-#include "boost/test/minimal.hpp"
-
-#include "optional_test_common.cpp"
-
//#ifndef BOOST_OPTIONAL_NO_CONVERTING_ASSIGNMENT
//#ifndef BOOST_OPTIONAL_NO_CONVERTING_COPY_CTOR
+using boost::optional;
+using boost::none;
+
#if (!defined BOOST_NO_CXX11_RVALUE_REFERENCES) && (!defined BOOST_NO_CXX11_VARIADIC_TEMPLATES)
class Guard
@@ -68,36 +55,36 @@ void test_emplace()
optional<Guard> o;
o.emplace();
- BOOST_CHECK(o);
- BOOST_CHECK(0 == o->which_ctor);
+ BOOST_TEST(o);
+ BOOST_TEST(0 == o->which_ctor);
o.emplace(i, 2.0);
- BOOST_CHECK(o);
- BOOST_CHECK(1 == o->which_ctor);
+ BOOST_TEST(o);
+ BOOST_TEST(1 == o->which_ctor);
o.emplace(1, d);
- BOOST_CHECK(o);
- BOOST_CHECK(2 == o->which_ctor);
+ BOOST_TEST(o);
+ BOOST_TEST(2 == o->which_ctor);
o.emplace(1, 2.0);
- BOOST_CHECK(o);
- BOOST_CHECK(3 == o->which_ctor);
+ BOOST_TEST(o);
+ BOOST_TEST(3 == o->which_ctor);
o.emplace(i, d);
- BOOST_CHECK(o);
- BOOST_CHECK(4 == o->which_ctor);
+ BOOST_TEST(o);
+ BOOST_TEST(4 == o->which_ctor);
o.emplace(cs);
- BOOST_CHECK(o);
- BOOST_CHECK(5 == o->which_ctor);
+ BOOST_TEST(o);
+ BOOST_TEST(5 == o->which_ctor);
o.emplace(ms);
- BOOST_CHECK(o);
- BOOST_CHECK(6 == o->which_ctor);
+ BOOST_TEST(o);
+ BOOST_TEST(6 == o->which_ctor);
o.emplace(std::string());
- BOOST_CHECK(o);
- BOOST_CHECK(7 == o->which_ctor);
+ BOOST_TEST(o);
+ BOOST_TEST(7 == o->which_ctor);
}
@@ -119,10 +106,10 @@ void test_no_moves_on_emplacement()
try {
optional<ThrowOnMove> o;
o.emplace(1);
- BOOST_CHECK(o);
+ BOOST_TEST(o);
}
catch (...) {
- BOOST_CHECK(false);
+ BOOST_TEST(false);
}
}
#endif
@@ -143,47 +130,40 @@ void test_clear_on_throw()
optional<Thrower> ot;
try {
ot.emplace(false);
- BOOST_CHECK(ot);
+ BOOST_TEST(ot);
} catch(...) {
- BOOST_CHECK(false);
+ BOOST_TEST(false);
}
try {
ot.emplace(true);
- BOOST_CHECK(false);
+ BOOST_TEST(false);
} catch(...) {
- BOOST_CHECK(!ot);
+ BOOST_TEST(!ot);
}
}
void test_no_assignment_on_emplacement()
{
optional<const std::string> os;
- BOOST_CHECK(!os);
+ BOOST_TEST(!os);
os.emplace("wow");
- BOOST_CHECK(os);
- BOOST_CHECK(*os == "wow");
+ BOOST_TEST(os);
+ BOOST_TEST_EQ(*os, "wow");
}
-int test_main( int, char* [] )
+int main()
{
- try
- {
#if (!defined BOOST_NO_CXX11_RVALUE_REFERENCES) && (!defined BOOST_NO_CXX11_VARIADIC_TEMPLATES)
- test_emplace();
+ test_emplace();
#endif
#if (!defined BOOST_NO_CXX11_RVALUE_REFERENCES)
- test_no_moves_on_emplacement();
+ test_no_moves_on_emplacement();
#endif
- test_clear_on_throw();
- test_no_assignment_on_emplacement();
- }
- catch ( ... )
- {
- BOOST_ERROR("Unexpected Exception caught!");
- }
-
- return 0;
+ test_clear_on_throw();
+ test_no_assignment_on_emplacement();
+
+ return boost::report_errors();
}
diff --git a/libs/optional/test/optional_test_equals_none.cpp b/libs/optional/test/optional_test_equals_none.cpp
index aed777198..1c8c5d8c7 100644
--- a/libs/optional/test/optional_test_equals_none.cpp
+++ b/libs/optional/test/optional_test_equals_none.cpp
@@ -8,18 +8,6 @@
//
// You are welcome to contact the author at:
// akrzemi1@gmail.com
-//
-// Revisions:
-//
-#include<iostream>
-#include<stdexcept>
-#include<string>
-
-#define BOOST_ENABLE_ASSERT_HANDLER
-
-#include "boost/bind/apply.hpp" // Included just to test proper interaction with boost::apply<> as reported by Daniel Wallin
-#include "boost/mpl/bool.hpp"
-#include "boost/mpl/bool_fwd.hpp" // For mpl::true_ and mpl::false_
#include "boost/optional/optional.hpp"
@@ -27,11 +15,9 @@
#pragma hdrstop
#endif
+#include "boost/core/lightweight_test.hpp"
#include "boost/none.hpp"
-#include "boost/test/minimal.hpp"
-
-#include "optional_test_common.cpp"
struct SemiRegular // no operator==
{
@@ -41,28 +27,17 @@ private: void operator!=(SemiRegular const&) const {}
void test_equal_to_none_of_noncomparable_T()
{
- optional<SemiRegular> i = SemiRegular();
- optional<SemiRegular> o;
-
- BOOST_CHECK(i != boost::none);
- BOOST_CHECK(boost::none != i);
- BOOST_CHECK(o == boost::none);
- BOOST_CHECK(boost::none == o);
+ boost::optional<SemiRegular> i = SemiRegular();
+ boost::optional<SemiRegular> o;
+
+ BOOST_TEST(i != boost::none);
+ BOOST_TEST(boost::none != i);
+ BOOST_TEST(o == boost::none);
+ BOOST_TEST(boost::none == o);
}
-int test_main( int, char* [] )
+int main()
{
- try
- {
- test_equal_to_none_of_noncomparable_T();
-
- }
- catch ( ... )
- {
- BOOST_ERROR("Unexpected Exception caught!");
- }
-
- return 0;
+ test_equal_to_none_of_noncomparable_T();
+ return boost::report_errors();
}
-
-
diff --git a/libs/optional/test/optional_test_fail_convert_assign_of_enums.cpp b/libs/optional/test/optional_test_fail_convert_assign_of_enums.cpp
new file mode 100644
index 000000000..59538505a
--- /dev/null
+++ b/libs/optional/test/optional_test_fail_convert_assign_of_enums.cpp
@@ -0,0 +1,26 @@
+// Copyright (C) 2015, Andrzej Krzemienski.
+//
+// Use, modification, and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/lib/optional for documentation.
+//
+// You are welcome to contact the author at:
+// akrzemi1@gmail.com
+
+#include "boost/optional.hpp"
+
+// THIS TEST SHOULD FAIL TO COMPILE
+
+enum E1 {e1};
+enum E2 {e2};
+
+void test_converitng_assignment_of_different_enums()
+{
+ boost::optional<E2> o2(e2);
+ boost::optional<E1> o1;
+ o1 = o2;
+}
+
+int main() {}
diff --git a/libs/optional/test/optional_test_fail_convert_from_null.cpp b/libs/optional/test/optional_test_fail_convert_from_null.cpp
new file mode 100644
index 000000000..a454615d4
--- /dev/null
+++ b/libs/optional/test/optional_test_fail_convert_from_null.cpp
@@ -0,0 +1,25 @@
+// Copyright (C) 2014, Andrzej Krzemienski.
+//
+// Use, modification, and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/lib/optional for documentation.
+//
+// You are welcome to contact the author at:
+// akrzemi1@gmail.com
+//
+#include "boost/optional.hpp"
+
+//
+// THIS TEST SHOULD FAIL TO COMPILE
+//
+
+struct NoInitFromNull{};
+
+void test_conversion_from_null()
+{
+ boost::optional<NoInitFromNull> opt = 0;
+}
+
+
diff --git a/libs/optional/test/optional_test_fail_io_without_io.cpp b/libs/optional/test/optional_test_fail_io_without_io.cpp
new file mode 100644
index 000000000..e986d3721
--- /dev/null
+++ b/libs/optional/test/optional_test_fail_io_without_io.cpp
@@ -0,0 +1,24 @@
+// Copyright (C) 2015, Andrzej Krzemienski.
+//
+// Use, modification, and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/lib/optional for documentation.
+//
+// You are welcome to contact the author at:
+// akrzemi1@gmail.com
+
+#include <iostream>
+#include "boost/optional.hpp"
+// but no boost/optional/optional_io.hpp
+
+// THIS TEST SHOULD FAIL TO COMPILE
+// Unless one includes header boost/optional/optional_io.hpp, it should not be possible
+// to stream out an optional object.
+
+void test_streaming_out_optional()
+{
+ boost::optional<int> opt;
+ std::cout << opt;
+} \ No newline at end of file
diff --git a/libs/optional/test/optional_test_inplace.cpp b/libs/optional/test/optional_test_inplace.cpp
deleted file mode 100644
index b0e828507..000000000
--- a/libs/optional/test/optional_test_inplace.cpp
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright (C) 2003, Fernando Luis Cacciola Carballal.
-//
-// Use, modification, and distribution is subject to the Boost Software
-// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// See http://www.boost.org/lib/optional for documentation.
-//
-// You are welcome to contact the author at:
-// fernando_cacciola@hotmail.com
-//
-#include<iostream>
-#include<stdexcept>
-#include<string>
-
-#define BOOST_ENABLE_ASSERT_HANDLER
-
-#include "boost/optional/optional.hpp"
-
-#ifndef BOOST_OPTIONAL_NO_INPLACE_FACTORY_SUPPORT
-#include "boost/utility/in_place_factory.hpp"
-#include "boost/utility/typed_in_place_factory.hpp"
-#endif
-
-#ifdef __BORLANDC__
-#pragma hdrstop
-#endif
-
-#include "boost/test/minimal.hpp"
-
-#include "optional_test_common.cpp"
-
-#ifndef BOOST_OPTIONAL_NO_INPLACE_FACTORY_SUPPORT
-struct A
-{
- A ( double a0, std::string a1 ) : m_a0(a0), m_a1(a1) {}
-
- friend bool operator == ( A const& x, A const& y )
- { return x.m_a0 == y.m_a0 && x.m_a1 == y.m_a1 ; }
-
- double m_a0 ;
- std::string m_a1 ;
-} ;
-
-int test_main( int, char* [] )
-{
- double a00 = 3.14, a10 = 6.02e-23;
- std::string a01("pi"), a11("mol");
-
- A a0(a00,a01);
- A a1(a10,a11);
-
- boost::optional<A> opt1(a0);
-
- boost::optional<A> opt2 ( boost::in_place(a00,a01) ) ;
-
- boost::optional<A> opt3 ( boost::in_place<A>(a00,a01) ) ;
-
- BOOST_CHECK( opt1 == opt2 ) ;
- BOOST_CHECK( opt2 == opt2 ) ;
- BOOST_CHECK( *opt2 == a0 ) ;
-
-#ifndef BOOST_OPTIONAL_WEAK_OVERLOAD_RESOLUTION
-
- opt2 = boost::in_place(a10,a11);
- BOOST_CHECK( *opt2 == a1 ) ;
-
- opt3 = boost::in_place<A>(a10,a11);
- BOOST_CHECK( *opt3 == a1 ) ;
-
-#endif
-
- return 0;
-}
-#else
-int test_main( int, char* [] )
-{
- // If in-place factories are not supported there is nothing to test
- return 0 ;
-}
-#endif
-
-
-
diff --git a/libs/optional/test/optional_test_inplace_factory.cpp b/libs/optional/test/optional_test_inplace_factory.cpp
new file mode 100644
index 000000000..1e852f0a2
--- /dev/null
+++ b/libs/optional/test/optional_test_inplace_factory.cpp
@@ -0,0 +1,104 @@
+// Copyright (C) 2003, Fernando Luis Cacciola Carballal.
+// Copyright (C) 2015 Andrzej Krzemienski.
+//
+// Use, modification, and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/lib/optional for documentation.
+//
+// You are welcome to contact the author at:
+// fernando_cacciola@hotmail.com
+
+#include<string>
+#include "boost/optional/optional.hpp"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+#ifndef BOOST_OPTIONAL_NO_INPLACE_FACTORY_SUPPORT
+#include "boost/utility/in_place_factory.hpp"
+#include "boost/utility/typed_in_place_factory.hpp"
+#endif
+
+#include "boost/core/lightweight_test.hpp"
+#include "boost/none.hpp"
+
+struct Guard
+{
+ double num;
+ std::string str;
+ Guard() : num() {}
+ Guard(double num_, std::string str_) : num(num_), str(str_) {}
+
+ friend bool operator==(const Guard& lhs, const Guard& rhs) { return lhs.num == rhs.num && lhs.str == rhs.str; }
+ friend bool operator!=(const Guard& lhs, const Guard& rhs) { return !(lhs == rhs); }
+
+private:
+ Guard(const Guard&);
+ Guard& operator=(const Guard&);
+};
+
+void test_ctor()
+{
+#ifndef BOOST_OPTIONAL_NO_INPLACE_FACTORY_SUPPORT
+ Guard g0, g1(1.0, "one"), g2(2.0, "two");
+
+ boost::optional<Guard> og0 ( boost::in_place() );
+ boost::optional<Guard> og1 ( boost::in_place(1.0, "one") );
+ boost::optional<Guard> og1_( boost::in_place(1.0, "one") );
+ boost::optional<Guard> og2 ( boost::in_place<Guard>(2.0, "two") );
+
+ BOOST_TEST(og0);
+ BOOST_TEST(og1);
+ BOOST_TEST(og1_);
+ BOOST_TEST(og2);
+
+ BOOST_TEST(*og0 == g0);
+ BOOST_TEST(*og1 == g1);
+ BOOST_TEST(*og1_ == g1);
+ BOOST_TEST(*og2 == g2);
+
+ BOOST_TEST(og1_ == og1);
+ BOOST_TEST(og1_ != og2);
+ BOOST_TEST(og1_ != og0);
+#endif
+}
+
+void test_assign()
+{
+#ifndef BOOST_OPTIONAL_NO_INPLACE_FACTORY_SUPPORT
+#ifndef BOOST_OPTIONAL_WEAK_OVERLOAD_RESOLUTION
+ Guard g0, g1(1.0, "one"), g2(2.0, "two");
+
+ boost::optional<Guard> og0, og1, og1_, og2;
+
+ og0 = boost::in_place();
+ og1 = boost::in_place(1.0, "one");
+ og1_ = boost::in_place(1.0, "one");
+ og2 = boost::in_place<Guard>(2.0, "two");
+
+ BOOST_TEST(og0);
+ BOOST_TEST(og1);
+ BOOST_TEST(og1_);
+ BOOST_TEST(og2);
+
+ BOOST_TEST(*og0 == g0);
+ BOOST_TEST(*og1 == g1);
+ BOOST_TEST(*og1_ == g1);
+ BOOST_TEST(*og2 == g2);
+
+ BOOST_TEST(og1_ == og1);
+ BOOST_TEST(og1_ != og2);
+ BOOST_TEST(og1_ != og0);
+#endif
+#endif
+}
+
+int main()
+{
+ test_ctor();
+ test_assign();
+ return boost::report_errors();
+} \ No newline at end of file
diff --git a/libs/optional/test/optional_test_inplace_fail.cpp b/libs/optional/test/optional_test_inplace_fail.cpp
index c6ba1d62e..bb7c26f6c 100644
--- a/libs/optional/test/optional_test_inplace_fail.cpp
+++ b/libs/optional/test/optional_test_inplace_fail.cpp
@@ -1,4 +1,5 @@
// Copyright (C) 2003, Fernando Luis Cacciola Carballal.
+// Copyright (C) 2015 Andrzej Krzemienski.
//
// Use, modification, and distribution is subject to the Boost Software
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
@@ -8,53 +9,45 @@
//
// You are welcome to contact the author at:
// fernando_cacciola@hotmail.com
-//
-#include<iostream>
-#include<stdexcept>
-#include<string>
-
-#define BOOST_ENABLE_ASSERT_HANDLER
+#include<string>
#include "boost/optional/optional.hpp"
-#ifndef BOOST_OPTIONAL_NO_INPLACE_FACTORY_SUPPORT
-#include "boost/utility/in_place_factory.hpp"
-#endif
-
#ifdef __BORLANDC__
#pragma hdrstop
#endif
-#include "boost/test/minimal.hpp"
-
-#include "optional_test_common.cpp"
-
#ifndef BOOST_OPTIONAL_NO_INPLACE_FACTORY_SUPPORT
-struct A
-{
- A ( double a0, std::string a1 ) : m_a0(a0), m_a1(a1) {}
-
- friend bool operator == ( A const& x, A const& y )
- { return x.m_a0 == y.m_a0 && x.m_a1 == y.m_a1 ; }
+#include "boost/utility/in_place_factory.hpp"
+#include "boost/utility/typed_in_place_factory.hpp"
+#endif
- double m_a0 ;
- std::string m_a1 ;
-} ;
+#include "boost/core/lightweight_test.hpp"
+#include "boost/none.hpp"
-int test_main( int, char* [] )
+struct Guard
{
- int invalid_extra_parameter ;
- boost::optional<A> opt2 ( boost::in_place(3.14,"pi",invalid_extra_parameter) ) ;
-
- return 0;
-}
-#else
-int test_main( int, char* [] )
+ double num;
+ std::string str;
+ Guard() : num() {}
+ Guard(double num_, std::string str_) : num(num_), str(str_) {}
+
+ friend bool operator==(const Guard& lhs, const Guard& rhs) { return lhs.num == rhs.num && lhs.str == rhs.str; }
+ friend bool operator!=(const Guard& lhs, const Guard& rhs) { return !(lhs == rhs); }
+
+private:
+ Guard(const Guard&);
+ Guard& operator=(const Guard&);
+};
+
+
+int main()
{
- int invalid_extra_parameter ;
- boost::optional<A> opt2 ( A(3.14,"pi",invalid_extra_parameter) ) ;
-
- return 0;
-}
+#ifndef BOOST_OPTIONAL_NO_INPLACE_FACTORY_SUPPORT
+ int excessive_param = 2;
+ boost::optional<Guard> og1 ( boost::in_place(1.0, "one", excessive_param) );
+#else
+ NOTHING_TO_TEST_SO_JUST_FAIL
#endif
-
+ return 0;
+} \ No newline at end of file
diff --git a/libs/optional/test/optional_test_inplace_fail2.cpp b/libs/optional/test/optional_test_inplace_fail2.cpp
index f82d85795..e6a000446 100644
--- a/libs/optional/test/optional_test_inplace_fail2.cpp
+++ b/libs/optional/test/optional_test_inplace_fail2.cpp
@@ -1,4 +1,5 @@
// Copyright (C) 2003, Fernando Luis Cacciola Carballal.
+// Copyright (C) 2015 Andrzej Krzemienski.
//
// Use, modification, and distribution is subject to the Boost Software
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
@@ -8,55 +9,45 @@
//
// You are welcome to contact the author at:
// fernando_cacciola@hotmail.com
-//
-#include<iostream>
-#include<stdexcept>
-#include<string>
-
-#define BOOST_ENABLE_ASSERT_HANDLER
+#include<string>
#include "boost/optional/optional.hpp"
-#ifndef BOOST_OPTIONAL_NO_INPLACE_FACTORY_SUPPORT
-#include "boost/utility/typed_in_place_factory.hpp"
-#endif
-
#ifdef __BORLANDC__
#pragma hdrstop
#endif
-#include "boost/test/minimal.hpp"
-
-#include "optional_test_common.cpp"
-
#ifndef BOOST_OPTIONAL_NO_INPLACE_FACTORY_SUPPORT
-struct A
-{
- A ( double a0, std::string a1 ) : m_a0(a0), m_a1(a1) {}
-
- friend bool operator == ( A const& x, A const& y )
- { return x.m_a0 == y.m_a0 && x.m_a1 == y.m_a1 ; }
+#include "boost/utility/in_place_factory.hpp"
+#include "boost/utility/typed_in_place_factory.hpp"
+#endif
- double m_a0 ;
- std::string m_a1 ;
-} ;
+#include "boost/core/lightweight_test.hpp"
+#include "boost/none.hpp"
-int test_main( int, char* [] )
+struct Guard
{
- // This must fail to compile.
- // The first template argument to in_place<> is the target-type,
- // not the first constructor parameter type.
- boost::optional<A> opt2 ( boost::in_place<int>(3.14,"pi") ) ;
-
- return 0;
-}
-#else
-int test_main( int, char* [] )
+ double num;
+ std::string str;
+ Guard() : num() {}
+ Guard(double num_, std::string str_) : num(num_), str(str_) {}
+
+ friend bool operator==(const Guard& lhs, const Guard& rhs) { return lhs.num == rhs.num && lhs.str == rhs.str; }
+ friend bool operator!=(const Guard& lhs, const Guard& rhs) { return !(lhs == rhs); }
+
+private:
+ Guard(const Guard&);
+ Guard& operator=(const Guard&);
+};
+
+
+int main()
{
- boost::optional<A> opt2 ( int(3.14) ) ;
-
- return 0;
-}
+#ifndef BOOST_OPTIONAL_NO_INPLACE_FACTORY_SUPPORT
+ typedef int BAD_TARGET_TYPE;
+ boost::optional<Guard> og1 ( boost::in_place<BAD_TARGET_TYPE>(1.0, "one") );
+#else
+ NOTHING_TO_TEST_SO_JUST_FAIL
#endif
-
-
+ return 0;
+} \ No newline at end of file
diff --git a/libs/optional/test/optional_test_io.cpp b/libs/optional/test/optional_test_io.cpp
index d4ee207ca..196363e22 100644
--- a/libs/optional/test/optional_test_io.cpp
+++ b/libs/optional/test/optional_test_io.cpp
@@ -1,4 +1,5 @@
// Copyright (C) 2003, Fernando Luis Cacciola Carballal.
+// Copyright (C) 2014 Andrzej Krzemienski.
//
// Use, modification, and distribution is subject to the Boost Software
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
@@ -8,52 +9,24 @@
//
// You are welcome to contact the author at:
// fernando_cacciola@hotmail.com
-//
-#include<stdexcept>
-#include<string>
-#include<sstream>
-
-#define BOOST_ENABLE_ASSERT_HANDLER
+#include <sstream>
#include "boost/optional/optional.hpp"
#include "boost/optional/optional_io.hpp"
-#include "boost/none.hpp"
-
-#include "boost/test/minimal.hpp"
-#ifdef ENABLE_TRACE
-#define TRACE(msg) std::cout << msg << std::endl ;
-#else
-#define TRACE(msg)
+#ifdef __BORLANDC__
+#pragma hdrstop
#endif
-namespace boost {
-
-void assertion_failed (char const * expr, char const * func, char const * file, long )
-{
- using std::string ;
- string msg = string("Boost assertion failure for \"")
- + string(expr)
- + string("\" at file \"")
- + string(file)
- + string("\" function \"")
- + string(func)
- + string("\"") ;
-
- TRACE(msg);
-
- throw std::logic_error(msg);
-}
-
-}
+#include "boost/core/lightweight_test.hpp"
-using namespace std ;
-using namespace boost ;
+using boost::optional;
+using boost::make_optional;
template<class Opt>
void test2( Opt o, Opt buff )
{
- stringstream s ;
+ std::stringstream s ;
const int markv = 123 ;
int mark = 0 ;
@@ -61,8 +34,8 @@ void test2( Opt o, Opt buff )
s << o << " " << markv ;
s >> buff >> mark ;
- BOOST_ASSERT( buff == o ) ;
- BOOST_ASSERT( mark == markv ) ;
+ BOOST_TEST( buff == o ) ;
+ BOOST_TEST( mark == markv ) ;
}
@@ -75,18 +48,41 @@ void test( T v, T w )
test2( optional<T> () , make_optional(w));
}
-int test_main( int, char* [] )
+
+template <class T>
+void subtest_tag_none_reversibility_with_optional(optional<T> ov)
{
- try
- {
- test(1,2);
- test(string("hello"),string("buffer"));
- }
- catch ( ... )
- {
- BOOST_ERROR("Unexpected Exception caught!");
- }
-
- return 0;
+ std::stringstream s;
+ s << boost::none;
+ s >> ov;
+ BOOST_TEST(!ov);
}
+template <class T>
+void subtest_tag_none_equivalence_with_optional()
+{
+ std::stringstream s, r;
+ optional<T> ov;
+ s << boost::none;
+ r << ov;
+ BOOST_TEST_EQ(s.str(), r.str());
+}
+
+template <class T>
+void test_tag_none(T v)
+{
+ subtest_tag_none_reversibility_with_optional(optional<T>(v));
+ subtest_tag_none_reversibility_with_optional(optional<T>());
+ subtest_tag_none_equivalence_with_optional<T>();
+}
+
+
+int main()
+{
+ test(1,2);
+ test(std::string("hello"), std::string("buffer"));
+ test_tag_none(10);
+ test_tag_none(std::string("text"));
+
+ return boost::report_errors();
+}
diff --git a/libs/optional/test/optional_test_minimum_requirements.cpp b/libs/optional/test/optional_test_minimum_requirements.cpp
index 5649d6935..77ef1fc21 100644
--- a/libs/optional/test/optional_test_minimum_requirements.cpp
+++ b/libs/optional/test/optional_test_minimum_requirements.cpp
@@ -1,4 +1,4 @@
-// Copyright (C) 2014 Andrzej Krzemienski.
+// Copyright (C) 2014-2015 Andrzej Krzemienski.
//
// Use, modification, and distribution is subject to the Boost Software
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
@@ -8,19 +8,6 @@
//
// You are welcome to contact the author at:
// akrzemi1@gmail.com
-//
-// Revisions:
-//
-#include<iostream>
-#include<stdexcept>
-#include<string>
-
-#define BOOST_ENABLE_ASSERT_HANDLER
-
-#include "boost/bind/apply.hpp" // Included just to test proper interaction with boost::apply<> as reported by Daniel Wallin
-#include "boost/mpl/bool.hpp"
-#include "boost/mpl/bool_fwd.hpp" // For mpl::true_ and mpl::false_
-#include "boost/static_assert.hpp"
#include "boost/optional/optional.hpp"
@@ -28,12 +15,9 @@
#pragma hdrstop
#endif
+#include "boost/core/lightweight_test.hpp"
#include "boost/none.hpp"
-#include "boost/test/minimal.hpp"
-
-#include "optional_test_common.cpp"
-
class NonConstructible
{
private:
@@ -46,16 +30,10 @@ private:
void test_non_constructible()
{
- optional<NonConstructible> o;
- BOOST_CHECK(!o);
- BOOST_CHECK(o == boost::none);
- try {
- o.value();
- BOOST_CHECK(false);
- }
- catch(...) {
- BOOST_CHECK(true);
- }
+ boost::optional<NonConstructible> o;
+ BOOST_TEST(!o);
+ BOOST_TEST(o == boost::none);
+ BOOST_TEST_THROWS(o.value(), boost::bad_optional_access);
}
class Guard
@@ -72,33 +50,26 @@ private:
void test_guard()
{
- optional<Guard> o;
+ boost::optional<Guard> o;
o.emplace(1);
- BOOST_CHECK(o);
+ BOOST_TEST(o);
+ BOOST_TEST(o != boost::none);
}
void test_non_assignable()
{
- optional<const std::string> o;
+ boost::optional<const std::string> o;
o.emplace("cat");
- BOOST_CHECK(o);
- BOOST_CHECK(*o == "cat");
+ BOOST_TEST(o);
+ BOOST_TEST(o != boost::none);
+ BOOST_TEST_EQ(*o, std::string("cat"));
}
-int test_main( int, char* [] )
+int main()
{
- try
- {
- test_non_constructible();
- test_guard();
- test_non_assignable();
- }
- catch ( ... )
- {
- BOOST_ERROR("Unexpected Exception caught!");
- }
-
- return 0;
-}
-
+ test_non_constructible();
+ test_guard();
+ test_non_assignable();
+ return boost::report_errors();
+} \ No newline at end of file
diff --git a/libs/optional/test/optional_test_move.cpp b/libs/optional/test/optional_test_move.cpp
index affa07f33..51aa970f3 100644
--- a/libs/optional/test/optional_test_move.cpp
+++ b/libs/optional/test/optional_test_move.cpp
@@ -1,4 +1,4 @@
-// Copyright (C) 2014 Andrzej Krzemienski.
+// Copyright (C) 2014 - 2015 Andrzej Krzemienski.
//
// Use, modification, and distribution is subject to the Boost Software
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
@@ -8,19 +8,7 @@
//
// You are welcome to contact the author at:
// akrzemi1@gmail.com
-//
-// Revisions:
-//
-#include<iostream>
-#include<stdexcept>
-#include<string>
-
-#define BOOST_ENABLE_ASSERT_HANDLER
-#include "boost/bind/apply.hpp" // Included just to test proper interaction with boost::apply<> as reported by Daniel Wallin
-#include "boost/mpl/bool.hpp"
-#include "boost/mpl/bool_fwd.hpp" // For mpl::true_ and mpl::false_
-#include "boost/static_assert.hpp"
#include "boost/optional/optional.hpp"
@@ -28,11 +16,10 @@
#pragma hdrstop
#endif
-#include "boost/none.hpp"
+#include "boost/core/lightweight_test.hpp"
-#include "boost/test/minimal.hpp"
-
-#include "optional_test_common.cpp"
+using boost::optional;
+using boost::none;
//#ifndef BOOST_OPTIONAL_NO_CONVERTING_ASSIGNMENT
//#ifndef BOOST_OPTIONAL_NO_CONVERTING_COPY_CTOR
@@ -86,37 +73,37 @@ bool operator!=( Oracle const& a, Oracle const& b ) { return a.val.i != b.val.i;
void test_move_ctor_from_U()
{
optional<Oracle> o1 ((OracleVal()));
- BOOST_CHECK(o1);
- BOOST_CHECK(o1->s == sValueMoveConstructed || o1->s == sMoveConstructed);
+ BOOST_TEST(o1);
+ BOOST_TEST(o1->s == sValueMoveConstructed || o1->s == sMoveConstructed);
OracleVal v1;
optional<Oracle> o2 (v1);
- BOOST_CHECK(o2);
- BOOST_CHECK(o2->s == sValueCopyConstructed || o2->s == sCopyConstructed || o2->s == sMoveConstructed );
- BOOST_CHECK(v1.s == sIntConstructed);
+ BOOST_TEST(o2);
+ BOOST_TEST(o2->s == sValueCopyConstructed || o2->s == sCopyConstructed || o2->s == sMoveConstructed );
+ BOOST_TEST(v1.s == sIntConstructed);
optional<Oracle> o3 (boost::move(v1));
- BOOST_CHECK(o3);
- BOOST_CHECK(o3->s == sValueMoveConstructed || o3->s == sMoveConstructed);
- BOOST_CHECK(v1.s == sMovedFrom);
+ BOOST_TEST(o3);
+ BOOST_TEST(o3->s == sValueMoveConstructed || o3->s == sMoveConstructed);
+ BOOST_TEST(v1.s == sMovedFrom);
}
void test_move_ctor_form_T()
{
optional<Oracle> o1 ((Oracle()));
- BOOST_CHECK(o1);
- BOOST_CHECK(o1->s == sMoveConstructed);
+ BOOST_TEST(o1);
+ BOOST_TEST(o1->s == sMoveConstructed);
Oracle v1;
optional<Oracle> o2 (v1);
- BOOST_CHECK(o2);
- BOOST_CHECK(o2->s == sCopyConstructed);
- BOOST_CHECK(v1.s == sDefaultConstructed);
+ BOOST_TEST(o2);
+ BOOST_TEST(o2->s == sCopyConstructed);
+ BOOST_TEST(v1.s == sDefaultConstructed);
optional<Oracle> o3 (boost::move(v1));
- BOOST_CHECK(o3);
- BOOST_CHECK(o3->s == sMoveConstructed);
- BOOST_CHECK(v1.s == sMovedFrom);
+ BOOST_TEST(o3);
+ BOOST_TEST(o3->s == sMoveConstructed);
+ BOOST_TEST(v1.s == sMovedFrom);
}
void test_move_ctor_from_optional_T()
@@ -124,22 +111,22 @@ void test_move_ctor_from_optional_T()
optional<Oracle> o1;
optional<Oracle> o2(boost::move(o1));
- BOOST_CHECK(!o1);
- BOOST_CHECK(!o2);
+ BOOST_TEST(!o1);
+ BOOST_TEST(!o2);
optional<Oracle> o3((Oracle()));
optional<Oracle> o4(boost::move(o3));
- BOOST_CHECK(o3);
- BOOST_CHECK(o4);
- BOOST_CHECK(o3->s == sMovedFrom);
- BOOST_CHECK(o4->s == sMoveConstructed);
+ BOOST_TEST(o3);
+ BOOST_TEST(o4);
+ BOOST_TEST(o3->s == sMovedFrom);
+ BOOST_TEST(o4->s == sMoveConstructed);
optional<Oracle> o5((optional<Oracle>()));
- BOOST_CHECK(!o5);
+ BOOST_TEST(!o5);
optional<Oracle> o6((optional<Oracle>(Oracle())));
- BOOST_CHECK(o6);
- BOOST_CHECK(o6->s == sMoveConstructed);
+ BOOST_TEST(o6);
+ BOOST_TEST(o6->s == sMoveConstructed);
optional<Oracle> o7(o6); // does copy ctor from non-const lvalue compile?
}
@@ -149,59 +136,59 @@ void test_move_assign_from_U()
optional<Oracle> o1 = boost::none; // test if additional ctors didn't break it
o1 = boost::none; // test if additional assignments didn't break it
o1 = OracleVal();
- BOOST_CHECK(o1);
+ BOOST_TEST(o1);
- BOOST_CHECK(o1->s == sValueMoveConstructed);
+ BOOST_TEST(o1->s == sValueMoveConstructed);
o1 = OracleVal();
- BOOST_CHECK(o1);
- BOOST_CHECK(o1->s == sMoveAssigned);
+ BOOST_TEST(o1);
+ BOOST_TEST(o1->s == sMoveAssigned);
OracleVal v1;
optional<Oracle> o2;
o2 = v1;
- BOOST_CHECK(o2);
- BOOST_CHECK(o2->s == sValueCopyConstructed);
- BOOST_CHECK(v1.s == sIntConstructed);
+ BOOST_TEST(o2);
+ BOOST_TEST(o2->s == sValueCopyConstructed);
+ BOOST_TEST(v1.s == sIntConstructed);
o2 = v1;
- BOOST_CHECK(o2);
- BOOST_CHECK(o2->s == sCopyAssigned || o2->s == sMoveAssigned);
- BOOST_CHECK(v1.s == sIntConstructed);
+ BOOST_TEST(o2);
+ BOOST_TEST(o2->s == sCopyAssigned || o2->s == sMoveAssigned);
+ BOOST_TEST(v1.s == sIntConstructed);
optional<Oracle> o3;
o3 = boost::move(v1);
- BOOST_CHECK(o3);
- BOOST_CHECK(o3->s == sValueMoveConstructed);
- BOOST_CHECK(v1.s == sMovedFrom);
+ BOOST_TEST(o3);
+ BOOST_TEST(o3->s == sValueMoveConstructed);
+ BOOST_TEST(v1.s == sMovedFrom);
}
void test_move_assign_from_T()
{
optional<Oracle> o1;
o1 = Oracle();
- BOOST_CHECK(o1);
- BOOST_CHECK(o1->s == sMoveConstructed);
+ BOOST_TEST(o1);
+ BOOST_TEST(o1->s == sMoveConstructed);
o1 = Oracle();
- BOOST_CHECK(o1);
- BOOST_CHECK(o1->s == sMoveAssigned);
+ BOOST_TEST(o1);
+ BOOST_TEST(o1->s == sMoveAssigned);
Oracle v1;
optional<Oracle> o2;
o2 = v1;
- BOOST_CHECK(o2);
- BOOST_CHECK(o2->s == sCopyConstructed);
- BOOST_CHECK(v1.s == sDefaultConstructed);
+ BOOST_TEST(o2);
+ BOOST_TEST(o2->s == sCopyConstructed);
+ BOOST_TEST(v1.s == sDefaultConstructed);
o2 = v1;
- BOOST_CHECK(o2);
- BOOST_CHECK(o2->s == sCopyAssigned);
- BOOST_CHECK(v1.s == sDefaultConstructed);
+ BOOST_TEST(o2);
+ BOOST_TEST(o2->s == sCopyAssigned);
+ BOOST_TEST(v1.s == sDefaultConstructed);
optional<Oracle> o3;
o3 = boost::move(v1);
- BOOST_CHECK(o3);
- BOOST_CHECK(o3->s == sMoveConstructed);
- BOOST_CHECK(v1.s == sMovedFrom);
+ BOOST_TEST(o3);
+ BOOST_TEST(o3->s == sMoveConstructed);
+ BOOST_TEST(v1.s == sMovedFrom);
}
void test_move_assign_from_optional_T()
@@ -209,23 +196,23 @@ void test_move_assign_from_optional_T()
optional<Oracle> o1;
optional<Oracle> o2;
o1 = optional<Oracle>();
- BOOST_CHECK(!o1);
+ BOOST_TEST(!o1);
optional<Oracle> o3((Oracle()));
o1 = o3;
- BOOST_CHECK(o3);
- BOOST_CHECK(o3->s == sMoveConstructed);
- BOOST_CHECK(o1);
- BOOST_CHECK(o1->s == sCopyConstructed);
+ BOOST_TEST(o3);
+ BOOST_TEST(o3->s == sMoveConstructed);
+ BOOST_TEST(o1);
+ BOOST_TEST(o1->s == sCopyConstructed);
o2 = boost::move(o3);
- BOOST_CHECK(o3);
- BOOST_CHECK(o3->s == sMovedFrom);
- BOOST_CHECK(o2);
- BOOST_CHECK(o2->s == sMoveConstructed);
+ BOOST_TEST(o3);
+ BOOST_TEST(o3->s == sMovedFrom);
+ BOOST_TEST(o2);
+ BOOST_TEST(o2->s == sMoveConstructed);
o2 = optional<Oracle>((Oracle()));
- BOOST_CHECK(o2);
- BOOST_CHECK(o2->s == sMoveAssigned);
+ BOOST_TEST(o2);
+ BOOST_TEST(o2->s == sMoveAssigned);
}
class MoveOnly
@@ -247,21 +234,21 @@ void test_with_move_only()
{
optional<MoveOnly> o1;
optional<MoveOnly> o2((MoveOnly(1)));
- BOOST_CHECK(o2);
- BOOST_CHECK(o2->val == 1);
+ BOOST_TEST(o2);
+ BOOST_TEST(o2->val == 1);
optional<MoveOnly> o3 (boost::move(o1));
- BOOST_CHECK(!o3);
+ BOOST_TEST(!o3);
optional<MoveOnly> o4 (boost::move(o2));
- BOOST_CHECK(o4);
- BOOST_CHECK(o4->val == 1);
- BOOST_CHECK(o2);
- BOOST_CHECK(o2->val == 0);
+ BOOST_TEST(o4);
+ BOOST_TEST(o4->val == 1);
+ BOOST_TEST(o2);
+ BOOST_TEST(o2->val == 0);
o3 = boost::move(o4);
- BOOST_CHECK(o3);
- BOOST_CHECK(o3->val == 1);
- BOOST_CHECK(o4);
- BOOST_CHECK(o4->val == 0);
+ BOOST_TEST(o3);
+ BOOST_TEST(o3->val == 1);
+ BOOST_TEST(o4);
+ BOOST_TEST(o4->val == 0);
}
class MoveOnlyB
@@ -287,15 +274,15 @@ void test_move_assign_from_optional_U()
optional<MoveOnlyB> b1;
b1 = boost::move(a);
- BOOST_CHECK(b1);
- BOOST_CHECK(b1->val == 2);
- BOOST_CHECK(a);
- BOOST_CHECK(a->val == 0);
+ BOOST_TEST(b1);
+ BOOST_TEST(b1->val == 2);
+ BOOST_TEST(a);
+ BOOST_TEST(a->val == 0);
b1 = MoveOnly(4);
- BOOST_CHECK(b1);
- BOOST_CHECK(b1->val == 4);
+ BOOST_TEST(b1);
+ BOOST_TEST(b1->val == 4);
}
void test_move_ctor_from_optional_U()
@@ -303,15 +290,15 @@ void test_move_ctor_from_optional_U()
optional<MoveOnly> a((MoveOnly(2)));
optional<MoveOnlyB> b1(boost::move(a));
- BOOST_CHECK(b1);
- BOOST_CHECK(b1->val == 2);
- BOOST_CHECK(a);
- BOOST_CHECK(a->val == 0);
+ BOOST_TEST(b1);
+ BOOST_TEST(b1->val == 2);
+ BOOST_TEST(a);
+ BOOST_TEST(a->val == 0);
optional<MoveOnlyB> b2(( optional<MoveOnly>(( MoveOnly(4) )) ));
- BOOST_CHECK(b2);
- BOOST_CHECK(b2->val == 4);
+ BOOST_TEST(b2);
+ BOOST_TEST(b2->val == 4);
}
void test_swap()
@@ -320,8 +307,8 @@ void test_swap()
optional<MoveOnly> b((MoveOnly(3)));
swap(a, b);
- BOOST_CHECK(a->val == 3);
- BOOST_CHECK(b->val == 2);
+ BOOST_TEST(a->val == 3);
+ BOOST_TEST(b->val == 2);
}
void test_optional_ref_to_movables()
@@ -329,66 +316,24 @@ void test_optional_ref_to_movables()
MoveOnly m(3);
optional<MoveOnly&> orm = m;
orm->val = 2;
- BOOST_CHECK(m.val == 2);
+ BOOST_TEST(m.val == 2);
optional<MoveOnly&> orm2 = orm;
orm2->val = 1;
- BOOST_CHECK(m.val == 1);
- BOOST_CHECK(orm->val == 1);
+ BOOST_TEST(m.val == 1);
+ BOOST_TEST(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
-struct NothrowBoth {
- NothrowBoth(NothrowBoth&&) BOOST_NOEXCEPT_IF(true) {};
- void operator=(NothrowBoth&&) BOOST_NOEXCEPT_IF(true) {};
-};
-struct NothrowCtor {
- NothrowCtor(NothrowCtor&&) BOOST_NOEXCEPT_IF(true) {};
- void operator=(NothrowCtor&&) BOOST_NOEXCEPT_IF(false) {};
-};
-struct NothrowAssign {
- NothrowAssign(NothrowAssign&&) BOOST_NOEXCEPT_IF(false) {};
- void operator=(NothrowAssign&&) BOOST_NOEXCEPT_IF(true) {};
-};
-struct NothrowNone {
- NothrowNone(NothrowNone&&) BOOST_NOEXCEPT_IF(false) {};
- void operator=(NothrowNone&&) BOOST_NOEXCEPT_IF(false) {};
-};
-
-#ifndef BOOST_NO_NOEXCEPT
-
-void test_noexcept() // this is a compile-time test
-{
- BOOST_STATIC_ASSERT(::boost::is_nothrow_move_constructible<optional<NothrowBoth> >::value);
- BOOST_STATIC_ASSERT(::boost::is_nothrow_move_assignable<optional<NothrowBoth> >::value);
- BOOST_STATIC_ASSERT(BOOST_NOEXCEPT_EXPR(optional<NothrowBoth>()));
-
- BOOST_STATIC_ASSERT(::boost::is_nothrow_move_constructible<optional<NothrowCtor> >::value);
- BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_assignable<optional<NothrowCtor> >::value);
- BOOST_STATIC_ASSERT(BOOST_NOEXCEPT_EXPR(optional<NothrowCtor>()));
-
- BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_constructible<optional<NothrowAssign> >::value);
- BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_assignable<optional<NothrowAssign> >::value);
- BOOST_STATIC_ASSERT(BOOST_NOEXCEPT_EXPR(optional<NothrowAssign>()));
-
- BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_constructible<optional<NothrowNone> >::value);
- BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_assignable<optional<NothrowNone> >::value);
- BOOST_STATIC_ASSERT(BOOST_NOEXCEPT_EXPR(optional<NothrowNone>()));
+ BOOST_TEST(m.val == 4);
+ BOOST_TEST(orm->val == 4);
+ BOOST_TEST(orm2->val == 4);
}
-#endif // !defned BOOST_NO_NOEXCEPT
#endif
-int test_main( int, char* [] )
+int main()
{
- try
- {
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
test_move_ctor_from_U();
test_move_ctor_form_T();
@@ -402,13 +347,6 @@ int test_main( int, char* [] )
test_optional_ref_to_movables();
test_swap();
#endif
- }
- catch ( ... )
- {
- BOOST_ERROR("Unexpected Exception caught!");
- }
- return 0;
+ return boost::report_errors();
}
-
-
diff --git a/libs/optional/test/optional_test_msvc_bug_workaround.cpp b/libs/optional/test/optional_test_msvc_bug_workaround.cpp
new file mode 100644
index 000000000..30f3b02f0
--- /dev/null
+++ b/libs/optional/test/optional_test_msvc_bug_workaround.cpp
@@ -0,0 +1,41 @@
+// Copyright (C) 2015 Andrzej Krzemienski.
+//
+// Use, modification, and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/lib/optional for documentation.
+//
+// You are welcome to contact the author at:
+// akrzemi1@gmail.com
+
+#define BOOST_OPTIONAL_CONFIG_NO_RVALUE_REFERENCES
+#include "boost/optional/optional.hpp"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+#include "boost/core/lightweight_test.hpp"
+
+
+struct Wrapper
+{
+ operator int () { return 9; }
+ operator boost::optional<int> () { return 7; }
+};
+
+void test()
+{
+#if (!defined BOOST_NO_CXX11_RVALUE_REFERENCES)
+ boost::optional<int> v = Wrapper();
+ BOOST_TEST(v);
+ BOOST_TEST_EQ(*v, 7);
+#endif
+}
+
+int main()
+{
+ test();
+ return boost::report_errors();
+} \ No newline at end of file
diff --git a/libs/optional/test/optional_test_noexcept_move.cpp b/libs/optional/test/optional_test_noexcept_move.cpp
new file mode 100644
index 000000000..b0c2220d8
--- /dev/null
+++ b/libs/optional/test/optional_test_noexcept_move.cpp
@@ -0,0 +1,116 @@
+// Copyright (C) 2014 Andrzej Krzemienski.
+//
+// Use, modification, and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/lib/optional for documentation.
+//
+// You are welcome to contact the author at:
+// akrzemi1@gmail.com
+
+#include "boost/static_assert.hpp"
+#include "boost/optional/optional.hpp"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+
+using boost::optional;
+
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+#ifndef BOOST_NO_NOEXCEPT
+
+// these 4 classes have different noexcept signatures in move operations
+struct NothrowBoth {
+ NothrowBoth(NothrowBoth&&) BOOST_NOEXCEPT_IF(true) {};
+ void operator=(NothrowBoth&&) BOOST_NOEXCEPT_IF(true) {};
+};
+struct NothrowCtor {
+ NothrowCtor(NothrowCtor&&) BOOST_NOEXCEPT_IF(true) {};
+ void operator=(NothrowCtor&&) BOOST_NOEXCEPT_IF(false) {};
+};
+struct NothrowAssign {
+ NothrowAssign(NothrowAssign&&) BOOST_NOEXCEPT_IF(false) {};
+ void operator=(NothrowAssign&&) BOOST_NOEXCEPT_IF(true) {};
+};
+struct NothrowNone {
+ NothrowNone(NothrowNone&&) BOOST_NOEXCEPT_IF(false) {};
+ void operator=(NothrowNone&&) BOOST_NOEXCEPT_IF(false) {};
+};
+
+#if 0 // these also test type_traits, which are wrong
+void test_noexcept_as_defined() // this is a compile-time test
+{
+ BOOST_STATIC_ASSERT(::boost::is_nothrow_move_constructible<NothrowBoth>::value);
+ BOOST_STATIC_ASSERT(::boost::is_nothrow_move_assignable<NothrowBoth>::value);
+
+ BOOST_STATIC_ASSERT(::boost::is_nothrow_move_constructible<NothrowCtor>::value);
+ BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_assignable<NothrowCtor>::value);
+
+ BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_constructible<NothrowAssign>::value);
+ BOOST_STATIC_ASSERT(::boost::is_nothrow_move_assignable<NothrowAssign>::value);
+
+ BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_constructible<NothrowNone>::value);
+ BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_assignable<NothrowNone>::value);
+}
+
+void test_noexcept_on_optional_with_type_traits() // this is a compile-time test
+{
+ BOOST_STATIC_ASSERT(::boost::is_nothrow_move_constructible<optional<NothrowBoth> >::value);
+ BOOST_STATIC_ASSERT(::boost::is_nothrow_move_assignable<optional<NothrowBoth> >::value);
+ BOOST_STATIC_ASSERT(BOOST_NOEXCEPT_EXPR(optional<NothrowBoth>()));
+
+ BOOST_STATIC_ASSERT(::boost::is_nothrow_move_constructible<optional<NothrowCtor> >::value);
+ BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_assignable<optional<NothrowCtor> >::value);
+ BOOST_STATIC_ASSERT(BOOST_NOEXCEPT_EXPR(optional<NothrowCtor>()));
+
+ BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_constructible<optional<NothrowAssign> >::value);
+ BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_assignable<optional<NothrowAssign> >::value);
+ BOOST_STATIC_ASSERT(BOOST_NOEXCEPT_EXPR(optional<NothrowAssign>()));
+
+ BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_constructible<optional<NothrowNone> >::value);
+ BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_assignable<optional<NothrowNone> >::value);
+ BOOST_STATIC_ASSERT(BOOST_NOEXCEPT_EXPR(optional<NothrowNone>()));
+}
+#endif
+
+void test_noexcept_optional_with_operator() // compile-time test
+{
+ typedef optional<NothrowBoth> ONx2;
+ typedef optional<NothrowCtor> ONxC;
+ typedef optional<NothrowAssign> ONxA;
+ typedef optional<NothrowNone> ONx0;
+ ONx2 onx2;
+ ONxC onxC;
+ ONxA onxA;
+ ONx0 onx0;
+
+ BOOST_STATIC_ASSERT( BOOST_NOEXCEPT_EXPR( ONx2() ));
+ BOOST_STATIC_ASSERT( BOOST_NOEXCEPT_EXPR( ONx2(boost::move(onx2)) ));
+ BOOST_STATIC_ASSERT( BOOST_NOEXCEPT_EXPR( onx2 = ONx2() ));
+
+ BOOST_STATIC_ASSERT( BOOST_NOEXCEPT_EXPR( ONxC() ));
+ BOOST_STATIC_ASSERT( BOOST_NOEXCEPT_EXPR( ONxC(boost::move(onxC)) ));
+ BOOST_STATIC_ASSERT(!BOOST_NOEXCEPT_EXPR( onxC = ONxC() ));
+
+ BOOST_STATIC_ASSERT( BOOST_NOEXCEPT_EXPR( ONxA() ));
+ BOOST_STATIC_ASSERT(!BOOST_NOEXCEPT_EXPR( ONxA(boost::move(onxA)) ));
+ BOOST_STATIC_ASSERT(!BOOST_NOEXCEPT_EXPR( onxA = ONxA() ));
+
+ BOOST_STATIC_ASSERT( BOOST_NOEXCEPT_EXPR( ONx0() ));
+ BOOST_STATIC_ASSERT(!BOOST_NOEXCEPT_EXPR( ONx0(boost::move(onx0)) ));
+ BOOST_STATIC_ASSERT(!BOOST_NOEXCEPT_EXPR( onx0 = ONx0() ));
+}
+
+#endif // !defned BOOST_NO_NOEXCEPT
+#endif // !defined BOOST_NO_CXX11_RVALUE_REFERENCES
+
+int main()
+{
+ return 0;
+}
+
+
diff --git a/libs/optional/test/optional_test_ref.cpp b/libs/optional/test/optional_test_ref.cpp
deleted file mode 100644
index c01b08e72..000000000
--- a/libs/optional/test/optional_test_ref.cpp
+++ /dev/null
@@ -1,373 +0,0 @@
-// Copyright (C) 2003, Fernando Luis Cacciola Carballal.
-//
-// Use, modification, and distribution is subject to the Boost Software
-// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// See http://www.boost.org/lib/optional for documentation.
-//
-// You are welcome to contact the author at:
-// fernando_cacciola@hotmail.com
-//
-#include<iostream>
-#include<stdexcept>
-#include<string>
-
-#define BOOST_ENABLE_ASSERT_HANDLER
-
-#include "boost/optional.hpp"
-
-#ifdef __BORLANDC__
-#pragma hdrstop
-#endif
-
-#include "boost/none.hpp"
-
-#include "boost/test/minimal.hpp"
-
-#include "optional_test_common.cpp"
-
-template<class T>
-inline void check_ref_uninitialized_const ( optional<T&> const& opt )
-{
-#ifndef BOOST_OPTIONAL_NO_NULL_COMPARE
- BOOST_CHECK( opt == 0 ) ;
-#endif
- BOOST_CHECK( !opt ) ;
-}
-template<class T>
-inline void check_ref_uninitialized ( optional<T&>& opt )
-{
-#ifndef BOOST_OPTIONAL_NO_NULL_COMPARE
- BOOST_CHECK( opt == 0 ) ;
-#endif
- BOOST_CHECK( !opt ) ;
-
- check_ref_uninitialized_const(opt);
-}
-
-template<class T>
-inline void check_ref_initialized_const ( optional<T&> const& opt )
-{
- BOOST_CHECK( opt ) ;
-
-#ifndef BOOST_OPTIONAL_NO_NULL_COMPARE
- BOOST_CHECK( opt != 0 ) ;
-#endif
-
- BOOST_CHECK ( !!opt ) ;
-}
-
-template<class T>
-inline void check_ref_initialized ( optional<T&>& opt )
-{
- BOOST_CHECK( opt ) ;
-
-#ifndef BOOST_OPTIONAL_NO_NULL_COMPARE
- BOOST_CHECK( opt != 0 ) ;
-#endif
-
- BOOST_CHECK ( !!opt ) ;
-
- check_ref_initialized_const(opt);
-}
-
-template<class T>
-inline void check_ref_value_const ( optional<T&> const& opt, T const& v, T const& z )
-{
- BOOST_CHECK( *opt == v ) ;
- BOOST_CHECK( *opt != z ) ;
- BOOST_CHECK( opt.get() == v ) ;
- BOOST_CHECK( opt.get() != z ) ;
-}
-
-template<class T>
-inline void check_ref_value ( optional<T&>& opt, T const& v, T const& z )
-{
- BOOST_CHECK( *opt == v ) ;
- BOOST_CHECK( *opt != z ) ;
- BOOST_CHECK( opt.get() == v ) ;
- BOOST_CHECK( opt.get() != z ) ;
-
- check_ref_value_const(opt,v,z);
-}
-
-//
-// Basic test.
-// Check ordinary functionality:
-// Initialization, assignment, comparison and value-accessing.
-//
-template<class T>
-void test_basics( T const* )
-{
- TRACE( std::endl << BOOST_CURRENT_FUNCTION );
-
- T z(0);
-
- T original_a(1);
-
- T a(1);
-
- T b(2);
-
- T c(10);
-
- T& aref = a ;
- T& bref = b ;
-
- // Default construction.
- // 'def' state is Uninitialized.
- // T::T() is not called
- optional<T&> def ;
- check_ref_uninitialized(def);
-
- // Direct initialization.
- // 'oa' state is Initialized and binds to 'a'
- // T::T( T const& x ) is NOT used becasue the optional holds a reference.
- set_pending_copy( ARG(T) ) ;
- optional<T&> oa ( aref ) ;
- check_is_pending_copy( ARG(T) );
- check_ref_initialized(oa);
- check_ref_value(oa,a,z);
- *oa = b ; // changes the value of 'a' through the reference
- BOOST_CHECK( a == b ) ;
-
-
- // Copy initialization.
- // T::T ( T const& x ) is NOT used becasue the optional holds a reference.
- set_pending_copy( ARG(T) ) ;
- optional<T&> const oa2 ( oa ) ;
- check_is_pending_copy( ARG(T) ) ;
- check_ref_initialized_const(oa2);
- check_ref_value_const(oa2,a,z);
- *oa2 = original_a ; // restores the value of 'a' through the reference
- BOOST_CHECK( a == original_a ) ;
-
- optional<T&> ob ;
-
- // Value-Assignment upon Uninitialized optional.
- // T::T ( T const& x ) is NOT used becasue the optional holds a reference.
- set_pending_copy( ARG(T) ) ;
- ob = a ; // Binds ob to a temporary non-const refererence to 'a'
- check_is_pending_copy( ARG(T) ) ;
- check_ref_initialized(ob);
- check_ref_value(ob,a,z);
- a = c;
- check_ref_value(ob,a,z);
-
- // Value-Assignment upon Initialized optional.
- // T::operator= ( T const& x ) is used.
- set_pending_assign( ARG(T) ) ;
- ob = b ; // Rebinds 'ob' to 'b' (without changing 'a')
- check_is_pending_assign( ARG(T) ) ;
- check_ref_initialized(ob);
- check_ref_value(ob,b,z);
- BOOST_CHECK(a == c); // From a=c in previous test
- b = c;
- check_ref_value(ob,b,z);
-
-
- // Assignment initialization.
- // T::T ( T const& x ) is NOT used becasue the optional holds a reference.
- set_pending_copy( ARG(T) ) ;
- optional<T&> const oa3 = b ;
- check_is_pending_copy( ARG(T) ) ;
- check_ref_initialized_const(oa3);
- check_ref_value_const(oa3,b,z);
-
-
- // Assignment
- // T::operator=( T const& x ) is used.
- set_pending_assign( ARG(T) ) ;
- oa = ob ; // Rebinds 'a' to 'b'
- check_is_pending_assign( ARG(T) ) ;
- check_ref_initialized(oa);
- a = original_a ;
- check_ref_value(oa,b,z);
-
- // Uninitializing Assignment upon Initialized Optional
- // T::~T() is NOT used becasue the optional holds a reference.
- set_pending_dtor( ARG(T) ) ;
- set_pending_copy( ARG(T) ) ;
- oa = def ;
- check_is_pending_dtor( ARG(T) ) ;
- check_is_pending_copy( ARG(T) ) ;
- check_ref_uninitialized(oa);
-
- // Uninitializing Assignment upon Uninitialized Optional
- // (Dtor is not called this time)
- set_pending_dtor( ARG(T) ) ;
- set_pending_copy( ARG(T) ) ;
- oa = def ;
- check_is_pending_dtor( ARG(T) ) ;
- check_is_pending_copy( ARG(T) ) ;
- check_ref_uninitialized(oa);
-
-
- // Deinitialization of Initialized Optional
- // T::~T() is NOT used becasue the optional holds a reference.
- set_pending_dtor( ARG(T) ) ;
- ob.reset();
- check_is_pending_dtor( ARG(T) ) ;
- check_ref_uninitialized(ob);
-
- // Deinitialization of Uninitialized Optional
- // T::~T() is not called this time
- set_pending_dtor( ARG(T) ) ;
- ob.reset();
- check_is_pending_dtor( ARG(T) ) ;
- check_ref_uninitialized(ob);
-}
-
-//
-// This verifies relational operators.
-//
-template<class T>
-void test_relops( T const* )
-{
- TRACE( std::endl << BOOST_CURRENT_FUNCTION );
-
- reset_throw_on_copy( ARG(T) ) ;
-
- T v0(18);
- T v1(19);
- T v2(19);
-
- optional<T&> def0 ;
- optional<T&> def1 ;
- optional<T&> opt0(v0);
- optional<T&> opt1(v1);
- optional<T&> opt2(v2);
-
- // Check identity
- BOOST_CHECK ( def0 == def0 ) ;
- BOOST_CHECK ( opt0 == opt0 ) ;
- BOOST_CHECK ( !(def0 != def0) ) ;
- BOOST_CHECK ( !(opt0 != opt0) ) ;
-
- // Check when both are uininitalized.
- BOOST_CHECK ( def0 == def1 ) ; // both uninitialized compare equal
- BOOST_CHECK ( !(def0 < def1) ) ; // uninitialized is never less than uninitialized
- BOOST_CHECK ( !(def0 > def1) ) ; // uninitialized is never greater than uninitialized
- BOOST_CHECK ( !(def0 != def1) ) ;
- BOOST_CHECK ( def0 <= def1 ) ;
- BOOST_CHECK ( def0 >= def1 ) ;
-
- // Check when only lhs is uninitialized.
- BOOST_CHECK ( def0 != opt0 ) ; // uninitialized is never equal to initialized
- BOOST_CHECK ( !(def0 == opt0) ) ;
- BOOST_CHECK ( def0 < opt0 ) ; // uninitialized is always less than initialized
- BOOST_CHECK ( !(def0 > opt0) ) ;
- BOOST_CHECK ( def0 <= opt0 ) ;
- BOOST_CHECK ( !(def0 >= opt0) ) ;
-
- // Check when only rhs is uninitialized.
- BOOST_CHECK ( opt0 != def0 ) ; // initialized is never equal to uninitialized
- BOOST_CHECK ( !(opt0 == def0) ) ;
- BOOST_CHECK ( !(opt0 < def0) ) ; // initialized is never less than uninitialized
- BOOST_CHECK ( opt0 > def0 ) ;
- BOOST_CHECK ( !(opt0 <= def0) ) ;
- BOOST_CHECK ( opt0 >= opt0 ) ;
-
- // If both are initialized, values are compared
- BOOST_CHECK ( opt0 != opt1 ) ;
- BOOST_CHECK ( opt1 == opt2 ) ;
- BOOST_CHECK ( opt0 < opt1 ) ;
- BOOST_CHECK ( opt1 > opt0 ) ;
- BOOST_CHECK ( opt1 <= opt2 ) ;
- BOOST_CHECK ( opt1 >= opt0 ) ;
-}
-
-template<class T>
-void test_none( T const* )
-{
- TRACE( std::endl << BOOST_CURRENT_FUNCTION );
-
- using boost::none ;
-
- T a(1234);
-
- optional<T&> def0 ;
- optional<T&> def1(none) ;
- optional<T&> non_def(a) ;
-
- BOOST_CHECK ( def0 == none ) ;
- BOOST_CHECK ( non_def != none ) ;
- BOOST_CHECK ( !def1 ) ;
-
- non_def = none ;
- BOOST_CHECK ( !non_def ) ;
-}
-
-template<class T>
-void test_arrow( T const* )
-{
- TRACE( std::endl << BOOST_CURRENT_FUNCTION );
-
- T a(1234);
-
- optional<T&> oa(a) ;
- optional<T&> const coa(a) ;
-
- BOOST_CHECK ( coa->V() == 1234 ) ;
-
- oa->V() = 4321 ;
-
- BOOST_CHECK ( a.V() = 4321 ) ;
-}
-
-void test_with_builtin_types()
-{
- TRACE( std::endl << BOOST_CURRENT_FUNCTION );
-
- test_basics( ARG(double) );
- test_relops( ARG(double) ) ;
- test_none ( ARG(double) ) ;
-}
-
-void test_with_class_type()
-{
- TRACE( std::endl << BOOST_CURRENT_FUNCTION );
-
- test_basics( ARG(X) );
- test_relops( ARG(X) ) ;
- test_none ( ARG(X) ) ;
- test_arrow ( ARG(X) ) ;
-
- BOOST_CHECK ( X::count == 0 ) ;
-}
-
-void test_binding()
-{
- int i = 0 ;
- optional<int&> ori1 = i ;
- BOOST_CHECK( &(*ori1) == &i ) ;
-
- optional<int&> ori2(i) ;
- BOOST_CHECK( &(*ori2) == &i ) ;
-
- int const ci = 0 ;
- optional<int const&> orci1 = ci ;
- BOOST_CHECK( &(*orci1) == &ci ) ;
-
- optional<int const&> orci2(ci) ;
- BOOST_CHECK( &(*orci2) == &ci ) ;
-}
-
-int test_main( int, char* [] )
-{
- try
- {
- test_with_class_type();
- test_with_builtin_types();
- test_binding();
- }
- catch ( ... )
- {
- BOOST_ERROR("Unexpected Exception caught!");
- }
-
- return 0;
-}
-
-
diff --git a/libs/optional/test/optional_test_ref_assign_const_int.cpp b/libs/optional/test/optional_test_ref_assign_const_int.cpp
new file mode 100644
index 000000000..a14ef6da9
--- /dev/null
+++ b/libs/optional/test/optional_test_ref_assign_const_int.cpp
@@ -0,0 +1,34 @@
+// Copyright (C) 2014 Andrzej Krzemienski.
+//
+// Use, modification, and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/lib/optional for documentation.
+//
+// You are welcome to contact the author at: akrzemi1@gmail.com
+
+
+#include "boost/optional/optional.hpp"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+#include "boost/core/lightweight_test.hpp"
+#include "testable_classes.hpp"
+#include "optional_ref_assign_test_defs.hpp"
+
+using boost::optional;
+using boost::none;
+
+
+int main()
+{
+ test_copy_assignment_for_const<int>();
+ test_copy_assignment_for_noconst_const<int>();
+ test_rebinding_assignment_semantics_const<int>();
+ test_rebinding_assignment_semantics_noconst_const<int>();
+
+ return boost::report_errors();
+}
diff --git a/libs/optional/test/optional_test_ref_assign_mutable_int.cpp b/libs/optional/test/optional_test_ref_assign_mutable_int.cpp
new file mode 100644
index 000000000..1c674dac7
--- /dev/null
+++ b/libs/optional/test/optional_test_ref_assign_mutable_int.cpp
@@ -0,0 +1,31 @@
+// Copyright (C) 2014 Andrzej Krzemienski.
+//
+// Use, modification, and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/lib/optional for documentation.
+//
+// You are welcome to contact the author at: akrzemi1@gmail.com
+
+
+#include "boost/optional/optional.hpp"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+#include "boost/core/lightweight_test.hpp"
+#include "testable_classes.hpp"
+#include "optional_ref_assign_test_defs.hpp"
+
+using boost::optional;
+using boost::none;
+
+int main()
+{
+ test_copy_assignment_for<int>();
+ test_rebinding_assignment_semantics<int>();
+
+ return boost::report_errors();
+}
diff --git a/libs/optional/test/optional_test_ref_assign_portable_minimum.cpp b/libs/optional/test/optional_test_ref_assign_portable_minimum.cpp
new file mode 100644
index 000000000..2a548abe3
--- /dev/null
+++ b/libs/optional/test/optional_test_ref_assign_portable_minimum.cpp
@@ -0,0 +1,44 @@
+// Copyright (C) 2014 Andrzej Krzemienski.
+//
+// Use, modification, and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/lib/optional for documentation.
+//
+// You are welcome to contact the author at: akrzemi1@gmail.com
+
+
+#include "boost/optional/optional.hpp"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+#include "boost/core/lightweight_test.hpp"
+#include "testable_classes.hpp"
+#include "optional_ref_assign_test_defs.hpp"
+
+using boost::optional;
+using boost::none;
+
+
+template <typename T>
+void test_optional_ref_assignment()
+{
+ test_copy_assignment_for<T>();
+ test_rebinding_assignment_semantics<T>();
+
+ test_copy_assignment_for_const<T>();
+ test_copy_assignment_for_noconst_const<T>();
+ test_rebinding_assignment_semantics_const<T>();
+ test_rebinding_assignment_semantics_noconst_const<T>();
+}
+
+int main()
+{
+ test_optional_ref_assignment<ScopeGuard>();
+ //test_optional_ref_assignment<Abstract>();
+
+ return boost::report_errors();
+}
diff --git a/libs/optional/test/optional_test_ref_convert_assign_const_int.cpp b/libs/optional/test/optional_test_ref_convert_assign_const_int.cpp
new file mode 100644
index 000000000..30d37a6d9
--- /dev/null
+++ b/libs/optional/test/optional_test_ref_convert_assign_const_int.cpp
@@ -0,0 +1,30 @@
+// Copyright (C) 2015 Andrzej Krzemienski.
+//
+// Use, modification, and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/lib/optional for documentation.
+//
+// You are welcome to contact the author at: akrzemi1@gmail.com
+
+
+#include "boost/optional/optional.hpp"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+#include "boost/core/addressof.hpp"
+#include "boost/core/enable_if.hpp"
+#include "boost/core/lightweight_test.hpp"
+#include "testable_classes.hpp"
+#include "optional_ref_assign_test_defs.hpp"
+
+int main()
+{
+ test_converting_assignment<const int>();
+ test_converting_assignment_for_noconst_const<int>();
+
+ return boost::report_errors();
+}
diff --git a/libs/optional/test/optional_test_ref_convert_assign_mutable_int.cpp b/libs/optional/test/optional_test_ref_convert_assign_mutable_int.cpp
new file mode 100644
index 000000000..4338e5297
--- /dev/null
+++ b/libs/optional/test/optional_test_ref_convert_assign_mutable_int.cpp
@@ -0,0 +1,29 @@
+// Copyright (C) 2015 Andrzej Krzemienski.
+//
+// Use, modification, and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/lib/optional for documentation.
+//
+// You are welcome to contact the author at: akrzemi1@gmail.com
+
+
+#include "boost/optional/optional.hpp"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+#include "boost/core/addressof.hpp"
+#include "boost/core/enable_if.hpp"
+#include "boost/core/lightweight_test.hpp"
+#include "testable_classes.hpp"
+#include "optional_ref_assign_test_defs.hpp"
+
+int main()
+{
+ test_converting_assignment<int>();
+
+ return boost::report_errors();
+}
diff --git a/libs/optional/test/optional_test_ref_convert_assign_non_int.cpp b/libs/optional/test/optional_test_ref_convert_assign_non_int.cpp
new file mode 100644
index 000000000..d59e46e54
--- /dev/null
+++ b/libs/optional/test/optional_test_ref_convert_assign_non_int.cpp
@@ -0,0 +1,39 @@
+// Copyright (C) 2015 Andrzej Krzemienski.
+//
+// Use, modification, and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/lib/optional for documentation.
+//
+// You are welcome to contact the author at: akrzemi1@gmail.com
+
+
+#include "boost/optional/optional.hpp"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+#include "boost/core/addressof.hpp"
+#include "boost/core/enable_if.hpp"
+#include "boost/core/lightweight_test.hpp"
+#include "testable_classes.hpp"
+#include "optional_ref_assign_test_defs.hpp"
+
+
+template <typename T>
+void test_all_const_cases()
+{
+ test_converting_assignment<T>();
+ test_converting_assignment<const T>();
+ test_converting_assignment_for_noconst_const<T>();
+}
+
+int main()
+{
+ test_all_const_cases<ScopeGuard>();
+ //test_all_const_cases<Abstract>();
+
+ return boost::report_errors();
+}
diff --git a/libs/optional/test/optional_test_ref_converting_ctor.cpp b/libs/optional/test/optional_test_ref_converting_ctor.cpp
new file mode 100644
index 000000000..d7df3dcb3
--- /dev/null
+++ b/libs/optional/test/optional_test_ref_converting_ctor.cpp
@@ -0,0 +1,107 @@
+// Copyright (C) 2014 Andrzej Krzemienski.
+//
+// Use, modification, and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/lib/optional for documentation.
+//
+// You are welcome to contact the author at: akrzemi1@gmail.com
+
+
+#include "boost/optional/optional.hpp"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+#include "boost/core/addressof.hpp"
+#include "boost/core/enable_if.hpp"
+#include "boost/core/lightweight_test.hpp"
+#include "testable_classes.hpp"
+
+using boost::optional;
+using boost::none;
+
+template <typename T>
+void test_converting_ctor()
+{
+ typename concrete_type_of<T>::type v1(1), v2(2);
+
+ {
+ optional<T&> o1 = v1, o1_ = v1, o2 = v2;
+
+ BOOST_TEST(o1);
+ BOOST_TEST(boost::addressof(*o1) == boost::addressof(v1));
+ BOOST_TEST(o1_);
+ BOOST_TEST(boost::addressof(*o1_) == boost::addressof(v1));
+ BOOST_TEST(boost::addressof(*o1_) == boost::addressof(*o1));
+
+ BOOST_TEST(o2);
+ BOOST_TEST(boost::addressof(*o2) == boost::addressof(v2));
+ BOOST_TEST(boost::addressof(*o2) != boost::addressof(*o1));
+ }
+ {
+ const optional<T&> o1 = v1, o1_ = v1, o2 = v2;
+
+ BOOST_TEST(o1);
+ BOOST_TEST(boost::addressof(*o1) == boost::addressof(v1));
+ BOOST_TEST(o1_);
+ BOOST_TEST(boost::addressof(*o1_) == boost::addressof(v1));
+ BOOST_TEST(boost::addressof(*o1_) == boost::addressof(*o1));
+
+ BOOST_TEST(o2);
+ BOOST_TEST(boost::addressof(*o2) == boost::addressof(v2));
+ BOOST_TEST(boost::addressof(*o2) != boost::addressof(*o1));
+ }
+}
+
+template <typename T>
+void test_converting_ctor_for_noconst_const()
+{
+ typename concrete_type_of<T>::type v1(1), v2(2);
+
+ {
+ optional<const T&> o1 = v1, o1_ = v1, o2 = v2;
+
+ BOOST_TEST(o1);
+ BOOST_TEST(boost::addressof(*o1) == boost::addressof(v1));
+ BOOST_TEST(o1_);
+ BOOST_TEST(boost::addressof(*o1_) == boost::addressof(v1));
+ BOOST_TEST(boost::addressof(*o1_) == boost::addressof(*o1));
+
+ BOOST_TEST(o2);
+ BOOST_TEST(boost::addressof(*o2) == boost::addressof(v2));
+ BOOST_TEST(boost::addressof(*o2) != boost::addressof(*o1));
+ }
+ {
+ const optional<const T&> o1 = v1, o1_ = v1, o2 = v2;
+
+ BOOST_TEST(o1);
+ BOOST_TEST(boost::addressof(*o1) == boost::addressof(v1));
+ BOOST_TEST(o1_);
+ BOOST_TEST(boost::addressof(*o1_) == boost::addressof(v1));
+ BOOST_TEST(boost::addressof(*o1_) == boost::addressof(*o1));
+
+ BOOST_TEST(o2);
+ BOOST_TEST(boost::addressof(*o2) == boost::addressof(v2));
+ BOOST_TEST(boost::addressof(*o2) != boost::addressof(*o1));
+ }
+}
+
+template <typename T>
+void test_all_const_cases()
+{
+ test_converting_ctor<T>();
+ test_converting_ctor<const T>();
+ test_converting_ctor_for_noconst_const<T>();
+}
+
+int main()
+{
+ test_all_const_cases<int>();
+ test_all_const_cases<ScopeGuard>();
+ //test_all_const_cases<Abstract>();
+
+ return boost::report_errors();
+}
diff --git a/libs/optional/test/optional_test_ref_move.cpp b/libs/optional/test/optional_test_ref_move.cpp
new file mode 100644
index 000000000..78b7bf27a
--- /dev/null
+++ b/libs/optional/test/optional_test_ref_move.cpp
@@ -0,0 +1,69 @@
+// Copyright (C) 2014 Andrzej Krzemienski.
+//
+// Use, modification, and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/lib/optional for documentation.
+//
+// You are welcome to contact the author at: akrzemi1@gmail.com
+
+
+#include "boost/optional/optional.hpp"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+#include <string>
+#include "boost/core/addressof.hpp"
+#include "boost/core/lightweight_test.hpp"
+
+using boost::optional;
+
+std::string global("text");
+
+optional<std::string&> make_optional_string_ref()
+{
+ return optional<std::string&>(global);
+}
+
+std::string& return_global()
+{
+ return global;
+}
+
+int main()
+{
+ optional<std::string&> opt;
+ opt = make_optional_string_ref();
+ BOOST_TEST(bool(opt));
+ BOOST_TEST(*opt == global);
+ BOOST_TEST(boost::addressof(*opt) == boost::addressof(global));
+
+ {
+ std::string& str = *make_optional_string_ref();
+ BOOST_TEST(str == global);
+ BOOST_TEST(boost::addressof(str) == boost::addressof(global));
+ }
+
+ {
+ std::string& str = make_optional_string_ref().value();
+ BOOST_TEST(str == global);
+ BOOST_TEST(boost::addressof(str) == boost::addressof(global));
+ }
+
+ {
+ std::string& str = make_optional_string_ref().value_or(global);
+ BOOST_TEST(str == global);
+ BOOST_TEST(boost::addressof(str) == boost::addressof(global));
+ }
+
+ {
+ std::string& str = make_optional_string_ref().value_or_eval(&return_global);
+ BOOST_TEST(str == global);
+ BOOST_TEST(boost::addressof(str) == boost::addressof(global));
+ }
+
+ return boost::report_errors();
+}
diff --git a/libs/optional/test/optional_test_ref_portable_minimum.cpp b/libs/optional/test/optional_test_ref_portable_minimum.cpp
new file mode 100644
index 000000000..e8439c92d
--- /dev/null
+++ b/libs/optional/test/optional_test_ref_portable_minimum.cpp
@@ -0,0 +1,448 @@
+// Copyright (C) 2014 Andrzej Krzemienski.
+//
+// Use, modification, and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/lib/optional for documentation.
+//
+// You are welcome to contact the author at: akrzemi1@gmail.com
+
+
+#include "boost/optional/optional.hpp"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+#include "boost/core/addressof.hpp"
+#include "boost/core/enable_if.hpp"
+#include "boost/core/lightweight_test.hpp"
+#include "testable_classes.hpp"
+
+using boost::optional;
+using boost::none;
+
+struct CountingClass
+{
+ static int count;
+ static int assign_count;
+ CountingClass() { ++count; }
+ CountingClass(const CountingClass&) { ++count; }
+ CountingClass& operator=(const CountingClass&) { ++assign_count; return *this; }
+ ~CountingClass() { ++count; }
+};
+
+int CountingClass::count = 0;
+int CountingClass::assign_count = 0;
+
+void test_no_object_creation()
+{
+ BOOST_TEST_EQ(0, CountingClass::count);
+ BOOST_TEST_EQ(0, CountingClass::assign_count);
+ {
+ CountingClass v1, v2;
+ optional<CountingClass&> oA(v1);
+ optional<CountingClass&> oB;
+ optional<CountingClass&> oC = oA;
+ oB = oA;
+ *oB = v2;
+ oC = none;
+ oC = optional<CountingClass&>(v2);
+ oB = none;
+ oA = oB;
+ }
+ BOOST_TEST_EQ(4, CountingClass::count);
+ BOOST_TEST_EQ(1, CountingClass::assign_count);
+}
+
+template <typename T>
+typename boost::enable_if< has_arrow<T> >::type
+test_arrow_const()
+{
+ const typename concrete_type_of<T>::type v(2);
+ optional<const T&> o(v);
+ BOOST_TEST(o);
+ BOOST_TEST_EQ(o->val(), 2);
+ BOOST_TEST(boost::addressof(o->val()) == boost::addressof(v.val()));
+}
+
+template <typename T>
+typename boost::disable_if< has_arrow<T> >::type
+test_arrow_const()
+{
+}
+
+template <typename T>
+typename boost::enable_if< has_arrow<T> >::type
+test_arrow_noconst_const()
+{
+ typename concrete_type_of<T>::type v(2);
+ optional<const T&> o(v);
+ BOOST_TEST(o);
+ BOOST_TEST_EQ(o->val(), 2);
+ BOOST_TEST(boost::addressof(o->val()) == boost::addressof(v.val()));
+
+ v.val() = 1;
+ BOOST_TEST(o);
+ BOOST_TEST_EQ(o->val(), 1);
+ BOOST_TEST_EQ(v.val(), 1);
+ BOOST_TEST(boost::addressof(o->val()) == boost::addressof(v.val()));
+}
+
+template <typename T>
+typename boost::disable_if< has_arrow<T> >::type
+test_arrow_noconst_const()
+{
+}
+
+template <typename T>
+typename boost::enable_if< has_arrow<T> >::type
+test_arrow()
+{
+ typename concrete_type_of<T>::type v(2);
+ optional<T&> o(v);
+ BOOST_TEST(o);
+ BOOST_TEST_EQ(o->val(), 2);
+ BOOST_TEST(boost::addressof(o->val()) == boost::addressof(v.val()));
+
+ v.val() = 1;
+ BOOST_TEST(o);
+ BOOST_TEST_EQ(o->val(), 1);
+ BOOST_TEST_EQ(v.val(), 1);
+ BOOST_TEST(boost::addressof(o->val()) == boost::addressof(v.val()));
+
+ o->val() = 3;
+ BOOST_TEST(o);
+ BOOST_TEST_EQ(o->val(), 3);
+ BOOST_TEST_EQ(v.val(), 3);
+ BOOST_TEST(boost::addressof(o->val()) == boost::addressof(v.val()));
+
+}
+
+template <typename T>
+typename boost::disable_if< has_arrow<T> >::type
+test_arrow()
+{
+}
+
+template <typename T>
+void test_not_containing_value_for()
+{
+ optional<T&> o1;
+ optional<T&> o2 = none;
+ optional<T&> o3 = o1;
+
+ BOOST_TEST(!o1);
+ BOOST_TEST(!o2);
+ BOOST_TEST(!o3);
+
+ BOOST_TEST(o1 == none);
+ BOOST_TEST(o2 == none);
+ BOOST_TEST(o3 == none);
+}
+
+template <typename T>
+void test_direct_init_for_const()
+{
+ const typename concrete_type_of<T>::type v(2);
+ optional<const T&> o(v);
+
+ BOOST_TEST(o);
+ BOOST_TEST(o != none);
+ BOOST_TEST(boost::addressof(*o) == boost::addressof(v));
+ BOOST_TEST_EQ(val(*o), val(v));
+ BOOST_TEST_EQ(val(*o), 2);
+}
+
+template <typename T>
+void test_direct_init_for_noconst_const()
+{
+ typename concrete_type_of<T>::type v(2);
+ optional<const T&> o(v);
+
+ BOOST_TEST(o);
+ BOOST_TEST(o != none);
+ BOOST_TEST(boost::addressof(*o) == boost::addressof(v));
+ BOOST_TEST_EQ(val(*o), val(v));
+ BOOST_TEST_EQ(val(*o), 2);
+
+ val(v) = 9;
+ BOOST_TEST(boost::addressof(*o) == boost::addressof(v));
+ BOOST_TEST_EQ(val(*o), val(v));
+ BOOST_TEST_EQ(val(*o), 9);
+ BOOST_TEST_EQ(val(v), 9);
+}
+
+template <typename T>
+void test_direct_init_for()
+{
+ typename concrete_type_of<T>::type v(2);
+ optional<T&> o(v);
+
+ BOOST_TEST(o);
+ BOOST_TEST(o != none);
+ BOOST_TEST(boost::addressof(*o) == boost::addressof(v));
+ BOOST_TEST_EQ(val(*o), val(v));
+ BOOST_TEST_EQ(val(*o), 2);
+
+ val(v) = 9;
+ BOOST_TEST(boost::addressof(*o) == boost::addressof(v));
+ BOOST_TEST_EQ(val(*o), val(v));
+ BOOST_TEST_EQ(val(*o), 9);
+ BOOST_TEST_EQ(val(v), 9);
+
+ val(*o) = 7;
+ BOOST_TEST(boost::addressof(*o) == boost::addressof(v));
+ BOOST_TEST_EQ(val(*o), val(v));
+ BOOST_TEST_EQ(val(*o), 7);
+ BOOST_TEST_EQ(val(v), 7);
+}
+
+template <typename T>
+void test_clearing_the_value()
+{
+ typename concrete_type_of<T>::type v(2);
+ optional<T&> o1(v), o2(v);
+
+ BOOST_TEST(o1);
+ BOOST_TEST(o1 != none);
+ BOOST_TEST(o2);
+ BOOST_TEST(o2 != none);
+
+ o1 = none;
+ BOOST_TEST(!o1);
+ BOOST_TEST(o1 == none);
+ BOOST_TEST(o2);
+ BOOST_TEST(o2 != none);
+ BOOST_TEST_EQ(val(*o2), 2);
+ BOOST_TEST(boost::addressof(*o2) == boost::addressof(v));
+ BOOST_TEST_EQ(val(v), 2);
+}
+
+template <typename T>
+void test_equality()
+{
+ typename concrete_type_of<T>::type v1(1), v2(2), v2_(2), v3(3);
+ optional<T&> o1(v1), o2(v2), o2_(v2_), o3(v3), o3_(v3), oN, oN_;
+ // o2 and o2_ point to different objects; o3 and o3_ point to the same object
+
+ BOOST_TEST(oN == oN);
+ BOOST_TEST(oN == oN_);
+ BOOST_TEST(oN_ == oN);
+ BOOST_TEST(o1 == o1);
+ BOOST_TEST(o2 == o2);
+ BOOST_TEST(o2 == o2_);
+ BOOST_TEST(o2_ == o2);
+ BOOST_TEST(o3 == o3);
+ BOOST_TEST(o3 == o3_);
+ BOOST_TEST(!(oN == o1));
+ BOOST_TEST(!(o1 == oN));
+ BOOST_TEST(!(o2 == o1));
+ BOOST_TEST(!(o2 == oN));
+
+ BOOST_TEST(!(oN != oN));
+ BOOST_TEST(!(oN != oN_));
+ BOOST_TEST(!(oN_ != oN));
+ BOOST_TEST(!(o1 != o1));
+ BOOST_TEST(!(o2 != o2));
+ BOOST_TEST(!(o2 != o2_));
+ BOOST_TEST(!(o2_ != o2));
+ BOOST_TEST(!(o3 != o3));
+ BOOST_TEST(!(o3 != o3_));
+ BOOST_TEST( (oN != o1));
+ BOOST_TEST( (o1 != oN));
+ BOOST_TEST( (o2 != o1));
+ BOOST_TEST( (o2 != oN));
+}
+
+template <typename T>
+void test_order()
+{
+ typename concrete_type_of<T>::type v1(1), v2(2), v2_(2), v3(3);
+ optional<T&> o1(v1), o2(v2), o2_(v2_), o3(v3), o3_(v3), oN, oN_;
+ // o2 and o2_ point to different objects; o3 and o3_ point to the same object
+
+ BOOST_TEST(!(oN < oN));
+ BOOST_TEST(!(oN < oN_));
+ BOOST_TEST(!(oN_ < oN));
+ BOOST_TEST(!(o1 < o1));
+ BOOST_TEST(!(o2 < o2));
+ BOOST_TEST(!(o2 < o2_));
+ BOOST_TEST(!(o2_ < o2));
+ BOOST_TEST(!(o3 < o3));
+ BOOST_TEST(!(o3 < o3_));
+
+ BOOST_TEST( (oN <= oN));
+ BOOST_TEST( (oN <= oN_));
+ BOOST_TEST( (oN_ <= oN));
+ BOOST_TEST( (o1 <= o1));
+ BOOST_TEST( (o2 <= o2));
+ BOOST_TEST( (o2 <= o2_));
+ BOOST_TEST( (o2_ <= o2));
+ BOOST_TEST( (o3 <= o3));
+ BOOST_TEST( (o3 <= o3_));
+
+ BOOST_TEST(!(oN > oN));
+ BOOST_TEST(!(oN > oN_));
+ BOOST_TEST(!(oN_ > oN));
+ BOOST_TEST(!(o1 > o1));
+ BOOST_TEST(!(o2 > o2));
+ BOOST_TEST(!(o2 > o2_));
+ BOOST_TEST(!(o2_ > o2));
+ BOOST_TEST(!(o3 > o3));
+ BOOST_TEST(!(o3 > o3_));
+
+ BOOST_TEST( (oN >= oN));
+ BOOST_TEST( (oN >= oN_));
+ BOOST_TEST( (oN_ >= oN));
+ BOOST_TEST( (o1 >= o1));
+ BOOST_TEST( (o2 >= o2));
+ BOOST_TEST( (o2 >= o2_));
+ BOOST_TEST( (o2_ >= o2));
+ BOOST_TEST( (o3 >= o3));
+ BOOST_TEST( (o3 >= o3_));
+
+ BOOST_TEST( (oN < o1));
+ BOOST_TEST( (oN_ < o1));
+ BOOST_TEST( (oN < o2));
+ BOOST_TEST( (oN_ < o2));
+ BOOST_TEST( (oN < o2_));
+ BOOST_TEST( (oN_ < o2_));
+ BOOST_TEST( (oN < o3));
+ BOOST_TEST( (oN_ < o3));
+ BOOST_TEST( (oN < o3_));
+ BOOST_TEST( (oN_ < o3_));
+ BOOST_TEST( (o1 < o2));
+ BOOST_TEST( (o1 < o2_));
+ BOOST_TEST( (o1 < o3));
+ BOOST_TEST( (o1 < o3_));
+ BOOST_TEST( (o2 < o3));
+ BOOST_TEST( (o2_ < o3));
+ BOOST_TEST( (o2 < o3_));
+ BOOST_TEST( (o2_ < o3_));
+
+ BOOST_TEST( (oN <= o1));
+ BOOST_TEST( (oN_ <= o1));
+ BOOST_TEST( (oN <= o2));
+ BOOST_TEST( (oN_ <= o2));
+ BOOST_TEST( (oN <= o2_));
+ BOOST_TEST( (oN_ <= o2_));
+ BOOST_TEST( (oN <= o3));
+ BOOST_TEST( (oN_ <= o3));
+ BOOST_TEST( (oN <= o3_));
+ BOOST_TEST( (oN_ <= o3_));
+ BOOST_TEST( (o1 <= o2));
+ BOOST_TEST( (o1 <= o2_));
+ BOOST_TEST( (o1 <= o3));
+ BOOST_TEST( (o1 <= o3_));
+ BOOST_TEST( (o2 <= o3));
+ BOOST_TEST( (o2_ <= o3));
+ BOOST_TEST( (o2 <= o3_));
+ BOOST_TEST( (o2_ <= o3_));
+
+ BOOST_TEST(!(oN > o1));
+ BOOST_TEST(!(oN_ > o1));
+ BOOST_TEST(!(oN > o2));
+ BOOST_TEST(!(oN_ > o2));
+ BOOST_TEST(!(oN > o2_));
+ BOOST_TEST(!(oN_ > o2_));
+ BOOST_TEST(!(oN > o3));
+ BOOST_TEST(!(oN_ > o3));
+ BOOST_TEST(!(oN > o3_));
+ BOOST_TEST(!(oN_ > o3_));
+ BOOST_TEST(!(o1 > o2));
+ BOOST_TEST(!(o1 > o2_));
+ BOOST_TEST(!(o1 > o3));
+ BOOST_TEST(!(o1 > o3_));
+ BOOST_TEST(!(o2 > o3));
+ BOOST_TEST(!(o2_ > o3));
+ BOOST_TEST(!(o2 > o3_));
+ BOOST_TEST(!(o2_ > o3_));
+
+ BOOST_TEST(!(oN >= o1));
+ BOOST_TEST(!(oN_ >= o1));
+ BOOST_TEST(!(oN >= o2));
+ BOOST_TEST(!(oN_ >= o2));
+ BOOST_TEST(!(oN >= o2_));
+ BOOST_TEST(!(oN_ >= o2_));
+ BOOST_TEST(!(oN >= o3));
+ BOOST_TEST(!(oN_ >= o3));
+ BOOST_TEST(!(oN >= o3_));
+ BOOST_TEST(!(oN_ >= o3_));
+ BOOST_TEST(!(o1 >= o2));
+ BOOST_TEST(!(o1 >= o2_));
+ BOOST_TEST(!(o1 >= o3));
+ BOOST_TEST(!(o1 >= o3_));
+ BOOST_TEST(!(o2 >= o3));
+ BOOST_TEST(!(o2_ >= o3));
+ BOOST_TEST(!(o2 >= o3_));
+ BOOST_TEST(!(o2_ >= o3_));
+
+ BOOST_TEST(!(o1 < oN));
+ BOOST_TEST(!(o1 < oN_));
+ BOOST_TEST(!(o2 < oN));
+ BOOST_TEST(!(o2 < oN_));
+ BOOST_TEST(!(o2_ < oN));
+ BOOST_TEST(!(o2_ < oN_));
+ BOOST_TEST(!(o3 < oN));
+ BOOST_TEST(!(o3 < oN_));
+ BOOST_TEST(!(o3_ < oN));
+ BOOST_TEST(!(o3_ < oN_));
+ BOOST_TEST(!(o2 < oN));
+ BOOST_TEST(!(o2_ < oN_));
+ BOOST_TEST(!(o3 < oN));
+ BOOST_TEST(!(o3_ < oN_));
+ BOOST_TEST(!(o3 < oN));
+ BOOST_TEST(!(o3 < oN_));
+ BOOST_TEST(!(o3_ < oN));
+ BOOST_TEST(!(o3_ < oN_));
+}
+
+template <typename T>
+void test_swap()
+{
+ typename concrete_type_of<T>::type v1(1), v2(2);
+ optional<T&> o1(v1), o1_(v1), o2(v2), o2_(v2), oN, oN_;
+
+ // swap(o1, o1); DOESN'T WORK
+}
+
+template <typename T>
+void test_optional_ref()
+{
+ test_not_containing_value_for<T>();
+ test_direct_init_for<T>();
+ test_clearing_the_value<T>();
+ test_arrow<T>();
+ test_equality<T>();
+ test_order<T>();
+ test_swap<T>();
+}
+
+template <typename T>
+void test_optional_const_ref()
+{
+ test_not_containing_value_for<const T>();
+ test_direct_init_for_const<T>();
+ test_direct_init_for_noconst_const<T>();
+ test_clearing_the_value<const T>();
+ test_arrow_const<T>();
+ test_arrow_noconst_const<T>();
+ test_equality<const T>();
+ test_order<const T>();
+ //test_swap<T>();
+}
+
+int main()
+{
+ test_optional_ref<int>();
+ test_optional_ref<ScopeGuard>();
+ //test_optional_ref<Abstract>();
+
+ test_optional_const_ref<int>();
+ test_optional_const_ref<ScopeGuard>();
+ //test_optional_const_ref<Abstract>();
+
+ return boost::report_errors();
+}
diff --git a/libs/optional/test/optional_test_swap.cpp b/libs/optional/test/optional_test_swap.cpp
new file mode 100644
index 000000000..b6802b18a
--- /dev/null
+++ b/libs/optional/test/optional_test_swap.cpp
@@ -0,0 +1,360 @@
+// Copyright (C) 2003, 2008 Fernando Luis Cacciola Carballal.
+// Copyright (C) 2015 Andrzej Krzemienski.
+//
+// Use, modification, and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/lib/optional for documentation.
+//
+// You are welcome to contact the author at:
+// fernando_cacciola@hotmail.com
+//
+// Revisions:
+// 12 May 2008 (added more swap tests)
+//
+
+#include "boost/optional/optional.hpp"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+#include "boost/core/lightweight_test.hpp"
+
+
+using boost::optional;
+using boost::none;
+
+#define ARG(T) (static_cast< T const* >(0))
+
+namespace optional_swap_test
+{
+ class default_ctor_exception : public std::exception {} ;
+ class copy_ctor_exception : public std::exception {} ;
+ class assignment_exception : public std::exception {} ;
+
+ //
+ // Base class for swap test classes. Its assignment should not be called, when swapping
+ // optional<T> objects. (The default std::swap would do so.)
+ //
+ class base_class_with_forbidden_assignment
+ {
+ public:
+ base_class_with_forbidden_assignment & operator=(const base_class_with_forbidden_assignment &)
+ {
+ BOOST_TEST(!"The assignment should not be used while swapping!");
+ throw assignment_exception();
+ }
+
+ virtual ~base_class_with_forbidden_assignment() {}
+ };
+
+ //
+ // Class without default constructor
+ //
+ class class_without_default_ctor : public base_class_with_forbidden_assignment
+ {
+ public:
+ char data;
+ explicit class_without_default_ctor(char arg) : data(arg) {}
+ };
+
+ //
+ // Class whose default constructor should not be used by optional::swap!
+ //
+ class class_whose_default_ctor_should_not_be_used : public base_class_with_forbidden_assignment
+ {
+ public:
+ char data;
+ explicit class_whose_default_ctor_should_not_be_used(char arg) : data(arg) {}
+
+ class_whose_default_ctor_should_not_be_used()
+ {
+ BOOST_TEST(!"This default constructor should not be used while swapping!");
+ throw default_ctor_exception();
+ }
+ };
+
+ //
+ // Class whose default constructor should be used by optional::swap.
+ // Its copy constructor should be avoided!
+ //
+ class class_whose_default_ctor_should_be_used : public base_class_with_forbidden_assignment
+ {
+ public:
+ char data;
+ explicit class_whose_default_ctor_should_be_used(char arg) : data(arg) { }
+
+ class_whose_default_ctor_should_be_used() : data('\0') { }
+
+ class_whose_default_ctor_should_be_used(const class_whose_default_ctor_should_be_used &)
+ {
+ BOOST_TEST(!"This copy constructor should not be used while swapping!");
+ throw copy_ctor_exception();
+ }
+ };
+
+ //
+ // Class template whose default constructor should be used by optional::swap.
+ // Its copy constructor should be avoided!
+ //
+ template <class T>
+ class template_whose_default_ctor_should_be_used : public base_class_with_forbidden_assignment
+ {
+ public:
+ T data;
+ explicit template_whose_default_ctor_should_be_used(T arg) : data(arg) { }
+
+ template_whose_default_ctor_should_be_used() : data('\0') { }
+
+ template_whose_default_ctor_should_be_used(const template_whose_default_ctor_should_be_used &)
+ {
+ BOOST_TEST(!"This copy constructor should not be used while swapping!");
+ throw copy_ctor_exception();
+ }
+ };
+
+ //
+ // Class whose explicit constructor should be used by optional::swap.
+ // Its other constructors should be avoided!
+ //
+ class class_whose_explicit_ctor_should_be_used : public base_class_with_forbidden_assignment
+ {
+ public:
+ char data;
+ explicit class_whose_explicit_ctor_should_be_used(char arg) : data(arg) { }
+
+ class_whose_explicit_ctor_should_be_used()
+ {
+ BOOST_TEST(!"This default constructor should not be used while swapping!");
+ throw default_ctor_exception();
+ }
+
+ class_whose_explicit_ctor_should_be_used(const class_whose_explicit_ctor_should_be_used &)
+ {
+ BOOST_TEST(!"This copy constructor should not be used while swapping!");
+ throw copy_ctor_exception();
+ }
+ };
+
+ void swap(class_whose_default_ctor_should_not_be_used & lhs, class_whose_default_ctor_should_not_be_used & rhs)
+ {
+ std::swap(lhs.data, rhs.data);
+ }
+
+ void swap(class_whose_default_ctor_should_be_used & lhs, class_whose_default_ctor_should_be_used & rhs)
+ {
+ std::swap(lhs.data, rhs.data);
+ }
+
+ void swap(class_without_default_ctor & lhs, class_without_default_ctor & rhs)
+ {
+ std::swap(lhs.data, rhs.data);
+ }
+
+ void swap(class_whose_explicit_ctor_should_be_used & lhs, class_whose_explicit_ctor_should_be_used & rhs)
+ {
+ std::swap(lhs.data, rhs.data);
+ }
+
+ template <class T>
+ void swap(template_whose_default_ctor_should_be_used<T> & lhs, template_whose_default_ctor_should_be_used<T> & rhs)
+ {
+ std::swap(lhs.data, rhs.data);
+ }
+
+ //
+ // optional<T>::swap should be customized when neither the copy constructor
+ // nor the default constructor of T are supposed to be used when swapping, e.g.,
+ // for the following type T = class_whose_explicit_ctor_should_be_used.
+ //
+ void swap(boost::optional<class_whose_explicit_ctor_should_be_used> & x, boost::optional<class_whose_explicit_ctor_should_be_used> & y)
+ {
+ bool hasX(x);
+ bool hasY(y);
+
+ if ( !hasX && !hasY )
+ return;
+
+ if( !hasX )
+ x = boost::in_place('\0');
+ else if ( !hasY )
+ y = boost::in_place('\0');
+
+ optional_swap_test::swap(*x,*y);
+
+ if( !hasX )
+ y = boost::none ;
+ else if( !hasY )
+ x = boost::none ;
+ }
+
+
+} // End of namespace optional_swap_test.
+
+
+namespace boost {
+
+//
+// Compile time tweaking on whether or not swap should use the default constructor:
+//
+
+template <> struct optional_swap_should_use_default_constructor<
+ optional_swap_test::class_whose_default_ctor_should_be_used> : mpl::true_ {} ;
+
+template <> struct optional_swap_should_use_default_constructor<
+ optional_swap_test::class_whose_default_ctor_should_not_be_used> : mpl::false_ {} ;
+
+template <class T> struct optional_swap_should_use_default_constructor<
+ optional_swap_test::template_whose_default_ctor_should_be_used<T> > : mpl::true_ {} ;
+
+
+//
+// Specialization of boost::swap:
+//
+template <>
+void swap(optional<optional_swap_test::class_whose_explicit_ctor_should_be_used> & x, optional<optional_swap_test::class_whose_explicit_ctor_should_be_used> & y)
+{
+ optional_swap_test::swap(x, y);
+}
+
+} // namespace boost
+
+
+namespace std {
+
+//
+// Specializations of std::swap:
+//
+
+template <>
+void swap(optional_swap_test::class_whose_default_ctor_should_be_used & x, optional_swap_test::class_whose_default_ctor_should_be_used & y)
+{
+ optional_swap_test::swap(x, y);
+}
+
+template <>
+void swap(optional_swap_test::class_whose_default_ctor_should_not_be_used & x, optional_swap_test::class_whose_default_ctor_should_not_be_used & y)
+{
+ optional_swap_test::swap(x, y);
+}
+
+template <>
+void swap(optional_swap_test::class_without_default_ctor & x, optional_swap_test::class_without_default_ctor & y)
+{
+ optional_swap_test::swap(x, y);
+}
+
+template <>
+void swap(optional_swap_test::class_whose_explicit_ctor_should_be_used & x, optional_swap_test::class_whose_explicit_ctor_should_be_used & y)
+{
+ optional_swap_test::swap(x, y);
+}
+
+} // namespace std
+
+
+//
+// Tests whether the swap function works properly for optional<T>.
+// Assumes that T has one data member, of type char.
+// Returns true iff the test is passed.
+//
+template <class T>
+void test_swap_function( T const* )
+{
+ try
+ {
+ optional<T> obj1;
+ optional<T> obj2('a');
+
+ // Self-swap should not have any effect.
+ swap(obj1, obj1);
+ swap(obj2, obj2);
+ BOOST_TEST(!obj1);
+ BOOST_TEST(!!obj2 && obj2->data == 'a');
+
+ // Call non-member swap.
+ swap(obj1, obj2);
+
+ // Test if obj1 and obj2 are really swapped.
+ BOOST_TEST(!!obj1 && obj1->data == 'a');
+ BOOST_TEST(!obj2);
+
+ // Call non-member swap one more time.
+ swap(obj1, obj2);
+
+ // Test if obj1 and obj2 are swapped back.
+ BOOST_TEST(!obj1);
+ BOOST_TEST(!!obj2 && obj2->data == 'a');
+ }
+ catch(const std::exception &)
+ {
+ // The swap function should not throw, for our test cases.
+ BOOST_TEST(!"throw in swap");
+ }
+}
+
+//
+// Tests whether the optional<T>::swap member function works properly.
+// Assumes that T has one data member, of type char.
+// Returns true iff the test is passed.
+//
+template <class T>
+void test_swap_member_function( T const* )
+{
+ try
+ {
+ optional<T> obj1;
+ optional<T> obj2('a');
+
+ // Self-swap should not have any effect.
+ obj1.swap(obj1);
+ obj2.swap(obj2);
+ BOOST_TEST(!obj1);
+ BOOST_TEST(!!obj2 && obj2->data == 'a');
+
+ // Call member swap.
+ obj1.swap(obj2);
+
+ // Test if obj1 and obj2 are really swapped.
+ BOOST_TEST(!!obj1 && obj1->data == 'a');
+ BOOST_TEST(!obj2);
+
+ // Call member swap one more time.
+ obj1.swap(obj2);
+
+ // Test if obj1 and obj2 are swapped back.
+ BOOST_TEST(!obj1);
+ BOOST_TEST(!!obj2 && obj2->data == 'a');
+ }
+ catch(const std::exception &)
+ {
+ BOOST_TEST(!"throw in swap");
+ }
+}
+
+
+//
+// Tests compile time tweaking of swap, by means of
+// optional_swap_should_use_default_constructor.
+//
+void test_swap_tweaking()
+{
+ ( test_swap_function( ARG(optional_swap_test::class_without_default_ctor) ) );
+ ( test_swap_function( ARG(optional_swap_test::class_whose_default_ctor_should_be_used) ) );
+ ( test_swap_function( ARG(optional_swap_test::class_whose_default_ctor_should_not_be_used) ) );
+ ( test_swap_function( ARG(optional_swap_test::class_whose_explicit_ctor_should_be_used) ) );
+ ( test_swap_function( ARG(optional_swap_test::template_whose_default_ctor_should_be_used<char>) ) );
+ ( test_swap_member_function( ARG(optional_swap_test::class_without_default_ctor) ) );
+ ( test_swap_member_function( ARG(optional_swap_test::class_whose_default_ctor_should_be_used) ) );
+ ( test_swap_member_function( ARG(optional_swap_test::class_whose_default_ctor_should_not_be_used) ) );
+ ( test_swap_member_function( ARG(optional_swap_test::class_whose_explicit_ctor_should_be_used) ) );
+ ( test_swap_member_function( ARG(optional_swap_test::template_whose_default_ctor_should_be_used<char>) ) );
+}
+
+int main()
+{
+ test_swap_tweaking();
+ return boost::report_errors();
+}
diff --git a/libs/optional/test/optional_test_the_compiler.cpp b/libs/optional/test/optional_test_the_compiler.cpp
deleted file mode 100644
index dea10cb3c..000000000
--- a/libs/optional/test/optional_test_the_compiler.cpp
+++ /dev/null
@@ -1,108 +0,0 @@
-// Copyright (C) 2014 Andrzej Krzemienski.
-//
-// Use, modification, and distribution is subject to the Boost Software
-// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-// See http://www.boost.org/lib/optional for documentation.
-//
-// You are welcome to contact the author at:
-// akrzemi1@gmail.com
-//
-// Revisions:
-//
-#include<iostream>
-#include<stdexcept>
-//#include<string>
-
-#define BOOST_ENABLE_ASSERT_HANDLER
-
-//#include "boost/bind/apply.hpp" // Included just to test proper interaction with boost::apply<> as reported by Daniel Wallin
-#include "boost/mpl/bool.hpp"
-#include "boost/mpl/bool_fwd.hpp" // For mpl::true_ and mpl::false_
-#include "boost/static_assert.hpp"
-
-#include "boost/optional/optional.hpp"
-
-#ifdef __BORLANDC__
-#pragma hdrstop
-#endif
-
-#include "boost/test/minimal.hpp"
-#include "optional_test_common.cpp"
-
-
-const int global_i = 0;
-
-class TestingReferenceBinding
-{
-public:
- TestingReferenceBinding(const int& ii)
- {
- BOOST_CHECK(&ii == &global_i);
- }
-
- void operator=(const int& ii)
- {
- BOOST_CHECK(&ii == &global_i);
- }
- #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
- void operator=(int&&)
- {
- BOOST_CHECK(false);
- }
- #endif
-};
-
-class TestingReferenceBinding2 // same definition as above, I need a different type
-{
-public:
- TestingReferenceBinding2(const int& ii)
- {
- BOOST_CHECK(&ii == &global_i);
- }
-
- void operator=(const int& ii)
- {
- BOOST_CHECK(&ii == &global_i);
- }
- #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
- void operator=(int&&)
- {
- BOOST_CHECK(false);
- }
- #endif
-};
-
-
-void test_broken_compiler()
-{
-// we are not testing boost::optional here, but the c++ compiler
-// if this test fails, optional references will obviously fail too
-
- const int& iref = global_i;
- BOOST_CHECK(&iref == &global_i);
-
- TestingReferenceBinding ttt = global_i;
- ttt = global_i;
-
- TestingReferenceBinding2 ttt2 = iref;
- ttt2 = iref;
-}
-
-
-int test_main( int, char* [] )
-{
- try
- {
- test_broken_compiler();
- }
- catch ( ... )
- {
- BOOST_ERROR("Unexpected Exception caught!");
- }
-
- return 0;
-}
-
-
diff --git a/libs/optional/test/optional_test_tie.cpp b/libs/optional/test/optional_test_tie.cpp
index c4fc4ed33..b5c5818f1 100644
--- a/libs/optional/test/optional_test_tie.cpp
+++ b/libs/optional/test/optional_test_tie.cpp
@@ -1,4 +1,5 @@
// Copyright (C) 2003, Fernando Luis Cacciola Carballal.
+// Copyright (C) 2015 Andrzej Krzemienski.
//
// Use, modification, and distribution is subject to the Boost Software
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
@@ -8,57 +9,66 @@
//
// You are welcome to contact the author at:
// fernando_cacciola@hotmail.com
-//
-#include<iostream>
-#include<stdexcept>
-#include<string>
-
-#define BOOST_ENABLE_ASSERT_HANDLER
-#include "boost/optional.hpp"
-#include "boost/tuple/tuple.hpp"
+#include "boost/optional/optional.hpp"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
-#include "boost/test/minimal.hpp"
-
-#include "optional_test_common.cpp"
+#include "boost/core/lightweight_test.hpp"
+#include "boost/none.hpp"
+#include "boost/tuple/tuple.hpp"
-// Test boost::tie() interoperabiliy.
-int test_main( int, char* [] )
+struct counting_oracle
{
- typedef X T ;
-
- try
- {
- TRACE( std::endl << BOOST_CURRENT_FUNCTION );
+ int val;
+ counting_oracle() : val() { ++default_ctor_count; }
+ counting_oracle(int v) : val(v) { ++val_ctor_count; }
+ counting_oracle(const counting_oracle& rhs) : val(rhs.val) { ++copy_ctor_count; }
+ counting_oracle& operator=(const counting_oracle& rhs) { val = rhs.val; ++copy_assign_count; return *this; }
+ ~counting_oracle() { ++dtor_count; }
- T z(0);
- T a(1);
- T b(2);
+ static int dtor_count;
+ static int default_ctor_count;
+ static int val_ctor_count;
+ static int copy_ctor_count;
+ static int copy_assign_count;
+ static int equals_count;
- optional<T> oa, ob ;
+ friend bool operator==(const counting_oracle& lhs, const counting_oracle& rhs) { ++equals_count; return lhs.val == rhs.val; }
- // T::T( T const& x ) is used
- set_pending_dtor( ARG(T) ) ;
- set_pending_copy( ARG(T) ) ;
- boost::tie(oa,ob) = std::make_pair(a,b) ;
- check_is_not_pending_dtor( ARG(T) ) ;
- check_is_not_pending_copy( ARG(T) ) ;
- check_initialized(oa);
- check_initialized(ob);
- check_value(oa,a,z);
- check_value(ob,b,z);
-
- }
- catch ( ... )
+ static void clear_count()
{
- BOOST_ERROR("Unexpected Exception caught!");
+ dtor_count = default_ctor_count = val_ctor_count = copy_ctor_count = copy_assign_count = equals_count = 0;
}
+};
+
+int counting_oracle::dtor_count = 0;
+int counting_oracle::default_ctor_count = 0;
+int counting_oracle::val_ctor_count = 0;
+int counting_oracle::copy_ctor_count = 0;
+int counting_oracle::copy_assign_count = 0;
+int counting_oracle::equals_count = 0;
+
+// Test boost::tie() interoperability.
+int main()
+{
+ const std::pair<counting_oracle, counting_oracle> pair(1, 2);
+ counting_oracle::clear_count();
+
+ boost::optional<counting_oracle> o1, o2;
+ boost::tie(o1, o2) = pair;
+
+ BOOST_TEST(o1);
+ BOOST_TEST(o2);
+ BOOST_TEST(*o1 == counting_oracle(1));
+ BOOST_TEST(*o2 == counting_oracle(2));
+ BOOST_TEST_EQ(2, counting_oracle::copy_ctor_count);
+ BOOST_TEST_EQ(0, counting_oracle::copy_assign_count);
+ BOOST_TEST_EQ(0, counting_oracle::default_ctor_count);
- return 0;
+ return boost::report_errors();
}
diff --git a/libs/optional/test/optional_test_value_access.cpp b/libs/optional/test/optional_test_value_access.cpp
index 63d65b9e2..1759588bf 100644
--- a/libs/optional/test/optional_test_value_access.cpp
+++ b/libs/optional/test/optional_test_value_access.cpp
@@ -8,18 +8,6 @@
//
// You are welcome to contact the author at:
// akrzemi1@gmail.com
-//
-// Revisions:
-//
-#include<iostream>
-#include<stdexcept>
-#include<string>
-
-#define BOOST_ENABLE_ASSERT_HANDLER
-
-#include "boost/bind/apply.hpp" // Included just to test proper interaction with boost::apply<> as reported by Daniel Wallin
-#include "boost/mpl/bool.hpp"
-#include "boost/mpl/bool_fwd.hpp" // For mpl::true_ and mpl::false_
#include "boost/optional/optional.hpp"
@@ -27,11 +15,10 @@
#pragma hdrstop
#endif
-#include "boost/none.hpp"
+#include "boost/core/ignore_unused.hpp"
+#include "boost/core/lightweight_test.hpp"
-#include "boost/test/minimal.hpp"
-
-#include "optional_test_common.cpp"
+using boost::optional;
struct IntWrapper
{
@@ -48,10 +35,10 @@ void test_function_value_or_for()
optional<T> oM1(1);
const optional<T> oC2(2);
- BOOST_CHECK(oM0.value_or(5) == 5);
- BOOST_CHECK(oC0.value_or(5) == 5);
- BOOST_CHECK(oM1.value_or(5) == 1);
- BOOST_CHECK(oC2.value_or(5) == 2);
+ BOOST_TEST(oM0.value_or(5) == 5);
+ BOOST_TEST(oC0.value_or(5) == 5);
+ BOOST_TEST(oM1.value_or(5) == 1);
+ BOOST_TEST(oC2.value_or(5) == 2);
}
template <typename T>
@@ -64,36 +51,24 @@ void test_function_value_for()
try
{
T& v = o1.value();
- BOOST_CHECK(v == 1);
+ BOOST_TEST(v == 1);
}
catch(...)
{
- BOOST_CHECK(false);
+ BOOST_TEST(false);
}
try
{
T const& v = oC.value();
- BOOST_CHECK(v == 2);
+ BOOST_TEST(v == 2);
}
catch(...)
{
- BOOST_CHECK(false);
+ BOOST_TEST(false);
}
- try
- {
- T& v = o0.value();
- BOOST_CHECK(false);
- boost::ignore_unused(v);
- }
- catch(boost::bad_optional_access const&)
- {
- }
- catch(...)
- {
- BOOST_CHECK(false);
- }
+ BOOST_TEST_THROWS(o0.value(), boost::bad_optional_access);
}
void test_function_value()
@@ -120,12 +95,12 @@ void test_function_value_or()
test_function_value_or_for<IntWrapper>();
optional<int> oi(1);
- BOOST_CHECK(oi.value_or(FatToIntConverter(2)) == 1);
- BOOST_CHECK(FatToIntConverter::conversions == 0);
+ BOOST_TEST(oi.value_or(FatToIntConverter(2)) == 1);
+ BOOST_TEST(FatToIntConverter::conversions == 0);
oi = boost::none;
- BOOST_CHECK(oi.value_or(FatToIntConverter(2)) == 2);
- BOOST_CHECK(FatToIntConverter::conversions == 1);
+ BOOST_TEST(oi.value_or(FatToIntConverter(2)) == 2);
+ BOOST_TEST(FatToIntConverter::conversions == 1);
}
@@ -156,42 +131,34 @@ void test_function_value_or_eval()
FunM funM;
FunC funC;
- BOOST_CHECK(o1.value_or_eval(funM) == 1);
- BOOST_CHECK(oN.value_or_eval(funM) == 5);
- BOOST_CHECK(o1.value_or_eval(FunM()) == 1);
- BOOST_CHECK(oN.value_or_eval(FunM()) == 5);
+ BOOST_TEST_EQ(o1.value_or_eval(funM), 1);
+ BOOST_TEST_EQ(oN.value_or_eval(funM), 5);
+ BOOST_TEST_EQ(o1.value_or_eval(FunM()), 1);
+ BOOST_TEST_EQ(oN.value_or_eval(FunM()), 5);
- BOOST_CHECK(o1.value_or_eval(funC) == 1);
- BOOST_CHECK(oN.value_or_eval(funC) == 6);
- BOOST_CHECK(o1.value_or_eval(FunC()) == 1);
- BOOST_CHECK(oN.value_or_eval(FunC()) == 6);
+ BOOST_TEST_EQ(o1.value_or_eval(funC), 1);
+ BOOST_TEST_EQ(oN.value_or_eval(funC), 6);
+ BOOST_TEST_EQ(o1.value_or_eval(FunC()), 1);
+ BOOST_TEST_EQ(oN.value_or_eval(FunC()), 6);
- BOOST_CHECK(o1.value_or_eval(funP) == 1);
- BOOST_CHECK(oN.value_or_eval(funP) == 7);
+ BOOST_TEST_EQ(o1.value_or_eval(funP), 1);
+ BOOST_TEST_EQ(oN.value_or_eval(funP), 7);
#ifndef BOOST_NO_CXX11_LAMBDAS
- BOOST_CHECK(o1.value_or_eval([](){return 8;}) == 1);
- BOOST_CHECK(oN.value_or_eval([](){return 8;}) == 8);
+ BOOST_TEST_EQ(o1.value_or_eval([](){return 8;}), 1);
+ BOOST_TEST_EQ(oN.value_or_eval([](){return 8;}), 8);
#endif
try
{
- BOOST_CHECK(o1.value_or_eval(throw_) == 1);
+ BOOST_TEST_EQ(o1.value_or_eval(throw_), 1);
}
catch(...)
{
- BOOST_CHECK(false);
+ BOOST_TEST(false);
}
- try
- {
- BOOST_CHECK(oN.value_or_eval(throw_) == 1);
- BOOST_CHECK(false);
- }
- catch(...)
- {
- BOOST_CHECK(true);
- }
+ BOOST_TEST_THROWS(oN.value_or_eval(throw_), int);
}
const optional<std::string> makeConstOptVal()
@@ -244,21 +211,12 @@ void test_move_only_getters()
#endif // !defined BOOST_NO_CXX11_REF_QUALIFIERS
-int test_main( int, char* [] )
+int main()
{
- try
- {
- test_function_value();
- test_function_value_or();
- test_function_value_or_eval();
- test_const_move();
- }
- catch ( ... )
- {
- BOOST_ERROR("Unexpected Exception caught!");
- }
+ test_function_value();
+ test_function_value_or();
+ test_function_value_or_eval();
+ test_const_move();
- return 0;
+ return boost::report_errors();
}
-
-
diff --git a/libs/optional/test/testable_classes.hpp b/libs/optional/test/testable_classes.hpp
new file mode 100644
index 000000000..e18359f93
--- /dev/null
+++ b/libs/optional/test/testable_classes.hpp
@@ -0,0 +1,91 @@
+// Copyright (C) 2014 Andrzej Krzemienski.
+//
+// Use, modification, and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/optional for documentation.
+//
+// You are welcome to contact the author at:
+// akrzemi1@gmail.com
+
+#ifndef BOOST_OPTIONAL_TEST_TESTABKE_CLASSES_AK_07JAN2015_HPP
+#define BOOST_OPTIONAL_TEST_TESTABKE_CLASSES_AK_07JAN2015_HPP
+
+struct ScopeGuard // no copy/move ctor/assign
+{
+ int val_;
+ explicit ScopeGuard(int v) : val_(v) {}
+ int& val() { return val_; }
+ const int& val() const { return val_; }
+
+private:
+ ScopeGuard(ScopeGuard const&);
+ void operator=(ScopeGuard const&);
+};
+
+struct Abstract
+{
+ virtual int& val() = 0;
+ virtual const int& val() const = 0;
+ virtual ~Abstract() {}
+ Abstract(){}
+
+private:
+ Abstract(Abstract const&);
+ void operator=(Abstract const&);
+};
+
+struct Impl : Abstract
+{
+ int val_;
+ Impl(int v) : val_(v) {}
+ int& val() { return val_; }
+ const int& val() const { return val_; }
+};
+
+template <typename T>
+struct concrete_type_of
+{
+ typedef T type;
+};
+
+template <>
+struct concrete_type_of<Abstract>
+{
+ typedef Impl type;
+};
+
+template <>
+struct concrete_type_of<const Abstract>
+{
+ typedef const Impl type;
+};
+
+template <typename T>
+struct has_arrow
+{
+ static const bool value = true;
+};
+
+template <>
+struct has_arrow<int>
+{
+ static const bool value = false;
+};
+
+int& val(int& i) { return i; }
+int& val(Abstract& a) { return a.val(); }
+int& val(ScopeGuard& g) { return g.val(); }
+
+const int& val(const int& i) { return i; }
+const int& val(const Abstract& a) { return a.val(); }
+const int& val(const ScopeGuard& g) { return g.val(); }
+
+bool operator==(const Abstract& l, const Abstract& r) { return l.val() == r.val(); }
+bool operator==(const ScopeGuard& l, const ScopeGuard& r) { return l.val() == r.val(); }
+
+bool operator<(const Abstract& l, const Abstract& r) { return l.val() < r.val(); }
+bool operator<(const ScopeGuard& l, const ScopeGuard& r) { return l.val() < r.val(); }
+
+#endif //BOOST_OPTIONAL_TEST_TESTABKE_CLASSES_AK_07JAN2015_HPP