diff --git a/include/boost/optional/optional.hpp b/include/boost/optional/optional.hpp index 0b931bb..8ef2e31 100644 --- a/include/boost/optional/optional.hpp +++ b/include/boost/optional/optional.hpp @@ -29,7 +29,9 @@ #include "boost/none_t.hpp" #include "boost/utility/compare_pointees.hpp" -#if BOOST_WORKAROUND(BOOST_MSVC, < 1300) +#include "boost/optional/optional_fwd.hpp" + +#if BOOST_WORKAROUND(BOOST_MSVC, == 1200) // VC6.0 has the following bug: // When a templated assignment operator exist, an implicit conversion // constructing an optional is used when assigment of the form: @@ -223,6 +225,23 @@ class optional_base : public optional_tag } } + // Assigns from another _convertible_ optional (deep-copies the rhs value) + template + void assign ( optional const& rhs ) + { + if (is_initialized()) + { + if ( rhs.is_initialized() ) + assign_value(static_cast(rhs.get()), is_reference_predicate() ); + else destroy(); + } + else + { + if ( rhs.is_initialized() ) + construct(static_cast(rhs.get())); + } + } + // Assigns from a T (deep-copies the rhs value) void assign ( argument_type val ) { @@ -481,6 +500,7 @@ class optional : public optional_detail::optional_base } #endif + #ifndef BOOST_OPTIONAL_NO_CONVERTING_ASSIGNMENT // Assigns from another convertible optional (converts && deep-copies the rhs value) // Requires a valid conversion from U to T. @@ -488,7 +508,7 @@ class optional : public optional_detail::optional_base template optional& operator= ( optional const& rhs ) { - this->assign(rhs.get()); + this->assign(rhs); return *this ; } #endif @@ -743,6 +763,11 @@ template inline void swap ( optional& x, optional& y ) optional_detail::optional_swap(x,y); } +template inline optional make_optional ( T const& v ) +{ + return optional(v); +} + } // namespace boost #endif