diff --git a/include/boost/optional/optional.hpp b/include/boost/optional/optional.hpp index 602690c..1dbf2a1 100644 --- a/include/boost/optional/optional.hpp +++ b/include/boost/optional/optional.hpp @@ -453,7 +453,9 @@ class optional_base : public optional_tag void destroy() { - if ( m_initialized ){ + if( dtor_optimized::value ) + m_initialized = false ; + else if ( m_initialized ){ destroy_impl(is_reference_predicate()) ; m_initialized = false ; } diff --git a/test/optional_test_trivial_assertions.cpp b/test/optional_test_trivial_assertions.cpp index d96e50d..8913b8f 100644 --- a/test/optional_test_trivial_assertions.cpp +++ b/test/optional_test_trivial_assertions.cpp @@ -36,14 +36,18 @@ BOOST_STATIC_ASSERT( of::copy_optimized::value ); - /* -has_trivial_assign -has_trivial_constructor -has_trivial_copy -has_trivial_copy_constructor -has_trivial_default_constructor -has_trivial_destructor + * The code generated below can be looked at with objdump to see if it is suboptimal */ +void assign_optional_int(oi& x,oi& y){ + x=y; +} + +void reset_optional_int(oi& x){ + x=boost::none; +} + + +