diff --git a/doc/1A_on_performance.qbk b/doc/1A_on_performance.qbk index 579e0b2..968b18f 100644 --- a/doc/1A_on_performance.qbk +++ b/doc/1A_on_performance.qbk @@ -19,7 +19,7 @@ Lifetime of the `T` inside `_storage` is manually controlled with placement-`new T _storage; }; -We call it a ['direct] storage. This makes `optional` a trivially-copyable type for scalar `T`s. This only works for compilers that support defaulted functions. On compilers without defaulted functions we still use the direct storage, but `optional` is no longer recognized as trivially-copyable. Apart from scalar types, we leave the programmer a way of customizing her type, so that it is reconized by `optional` as candidate for optimized storage, by specializing type trait `boost::opitonal_config::optional_uses_direct_storage_for`: +We call it a ['direct] storage. This makes `optional` a trivially-copyable type for scalar `T`s. This only works for compilers that support defaulted functions (including defaulted move assignment and constructor). On compilers without defaulted functions we still use the direct storage, but `optional` is no longer recognized as trivially-copyable. Apart from scalar types, we leave the programmer a way of customizing her type, so that it is reconized by `optional` as candidate for optimized storage, by specializing type trait `boost::opitonal_config::optional_uses_direct_storage_for`: struct X // not trivial { diff --git a/include/boost/optional/detail/optional_config.hpp b/include/boost/optional/detail/optional_config.hpp index 02dac68..bc6f32f 100644 --- a/include/boost/optional/detail/optional_config.hpp +++ b/include/boost/optional/detail/optional_config.hpp @@ -114,14 +114,16 @@ #endif -// Detection of correctly implemented defaulted functions +// Detect suport for defaulting move operations +// (some older compilers implement rvalue references, +// defaulted funcitons but move operations are not special members and cannot be defaulted) #ifdef BOOST_NO_CXX11_DEFAULTED_FUNCTIONS -# define BOOST_OPTIONAL_DETAIL_NO_DEFAULTED_FUNCTIONS +# define BOOST_OPTIONAL_DETAIL_NO_DEFAULTED_MOVE_FUNCTIONS #elif BOOST_WORKAROUND(BOOST_MSVC, < 1900) -// on MSVC 12.0 move constructor and move assignment are not reconized as special functions -// and they cannot be defaulted -# define BOOST_OPTIONAL_DETAIL_NO_DEFAULTED_FUNCTIONS +# define BOOST_OPTIONAL_DETAIL_NO_DEFAULTED_MOVE_FUNCTIONS +#elif BOOST_WORKAROUND(BOOST_GCC_VERSION, < 40600) +# define BOOST_OPTIONAL_DETAIL_NO_DEFAULTED_MOVE_FUNCTIONS #endif diff --git a/test/optional_test_experimental_traits.cpp b/test/optional_test_experimental_traits.cpp index 14ab705..8093056 100644 --- a/test/optional_test_experimental_traits.cpp +++ b/test/optional_test_experimental_traits.cpp @@ -20,7 +20,7 @@ #include "boost/type_traits/is_base_of.hpp" #include "boost/optional/detail/experimental_traits.hpp" -#ifndef BOOST_OPTIONAL_DETAIL_NO_DEFAULTED_FUNCTIONS +#ifndef BOOST_OPTIONAL_DETAIL_NO_DEFAULTED_MOVE_FUNCTIONS struct PrivDefault { @@ -144,7 +144,7 @@ void test_trivial_copyability() int main() { -#ifndef BOOST_OPTIONAL_DETAIL_NO_DEFAULTED_FUNCTIONS +#ifndef BOOST_OPTIONAL_DETAIL_NO_DEFAULTED_MOVE_FUNCTIONS test_type_traits(); test_trivial_copyability(); #endif diff --git a/test/optional_test_static_properties.cpp b/test/optional_test_static_properties.cpp index 2419221..c47bfa9 100644 --- a/test/optional_test_static_properties.cpp +++ b/test/optional_test_static_properties.cpp @@ -20,7 +20,7 @@ #include "boost/type_traits/is_base_of.hpp" #include "boost/optional/detail/experimental_traits.hpp" -#ifndef BOOST_OPTIONAL_DETAIL_NO_DEFAULTED_FUNCTIONS +#ifndef BOOST_OPTIONAL_DETAIL_NO_DEFAULTED_MOVE_FUNCTIONS struct PrivDefault { @@ -138,7 +138,7 @@ void test_trivial_copyability() int main() { -#ifndef BOOST_OPTIONAL_DETAIL_NO_DEFAULTED_FUNCTIONS +#ifndef BOOST_OPTIONAL_DETAIL_NO_DEFAULTED_MOVE_FUNCTIONS test_type_traits(); test_trivial_copyability(); #endif