diff --git a/include/boost/optional/detail/optional_config.hpp b/include/boost/optional/detail/optional_config.hpp index 6bb411c..73467a3 100644 --- a/include/boost/optional/detail/optional_config.hpp +++ b/include/boost/optional/detail/optional_config.hpp @@ -144,6 +144,16 @@ # define BOOST_OPTIONAL_DETAIL_NO_SPEC_FOR_TRIVIAL_TYPES #elif !defined BOOST_HAS_TRIVIAL_DESTRUCTOR # define BOOST_OPTIONAL_DETAIL_NO_SPEC_FOR_TRIVIAL_TYPES +#elif BOOST_WORKAROUND(BOOST_GCC, < 50000) +# define BOOST_OPTIONAL_DETAIL_NO_SPEC_FOR_TRIVIAL_TYPES +#endif + +#if __cplusplus >= 201103L +# if BOOST_WORKAROUND(BOOST_GCC, >= 50000) && +# define BOOST_OPTIONAL_DETAIL_USE_STD_TYPE_TRAITS +# elif (defined BOOST_CLANG) +# define BOOST_OPTIONAL_DETAIL_USE_STD_TYPE_TRAITS +# endif #endif #ifdef BOOST_OPTIONAL_CONFIG_NO_POD_SPEC diff --git a/include/boost/optional/optional.hpp b/include/boost/optional/optional.hpp index b955fb7..e7eab01 100644 --- a/include/boost/optional/optional.hpp +++ b/include/boost/optional/optional.hpp @@ -20,6 +20,10 @@ #include #include +#ifdef BOOST_OPTIONAL_DETAIL_USE_STD_TYPE_TRAITS +# include +#endif + #include #include #include @@ -828,10 +832,16 @@ struct is_type_trivially_copyable namespace optional_config { +#ifndef BOOST_OPTIONAL_DETAIL_USE_STD_TYPE_TRAITS +# define BOOST_OPTIONAL_DETAIL_HAS_TRIVIAL_CTOR(T) BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) +#else +# define BOOST_OPTIONAL_DETAIL_HAS_TRIVIAL_CTOR(T) std::is_trivially_default_constructible::value +#endif + #ifndef BOOST_OPTIONAL_DETAIL_NO_SPEC_FOR_TRIVIAL_TYPES template struct is_type_trivial - : boost::conditional< (optional_detail::is_type_trivially_copyable::value && BOOST_HAS_TRIVIAL_CONSTRUCTOR(T)) || + : boost::conditional< (optional_detail::is_type_trivially_copyable::value && BOOST_OPTIONAL_DETAIL_HAS_TRIVIAL_CTOR(T)) || (boost::is_scalar::value && !boost::is_const::value && !boost::is_volatile::value) , boost::true_type, boost::false_type>::type {};