diff options
Diffstat (limited to 'boost/variant/detail/apply_visitor_unary.hpp')
-rw-r--r-- | boost/variant/detail/apply_visitor_unary.hpp | 39 |
1 files changed, 31 insertions, 8 deletions
diff --git a/boost/variant/detail/apply_visitor_unary.hpp b/boost/variant/detail/apply_visitor_unary.hpp index d4e2c166dc..09f70a0b47 100644 --- a/boost/variant/detail/apply_visitor_unary.hpp +++ b/boost/variant/detail/apply_visitor_unary.hpp @@ -16,11 +16,13 @@ #include <boost/config.hpp> #include <boost/detail/workaround.hpp> #include <boost/variant/detail/generic_result_type.hpp> +#include <boost/move/utility.hpp> #if BOOST_WORKAROUND(__EDG__, BOOST_TESTED_AT(302)) #include <boost/core/enable_if.hpp> #include <boost/mpl/not.hpp> #include <boost/type_traits/is_const.hpp> +#include <boost/type_traits/remove_reference.hpp> #endif #if !defined(BOOST_NO_CXX14_DECLTYPE_AUTO) && !defined(BOOST_NO_CXX11_DECLTYPE_N3276) @@ -62,6 +64,15 @@ namespace boost { #endif // EDG-based compilers workaround +#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES +template <typename Visitor, typename Visitable> +inline + BOOST_VARIANT_AUX_APPLY_VISITOR_NON_CONST_RESULT_TYPE(Visitor) +apply_visitor(Visitor& visitor, Visitable&& visitable) +{ + return ::boost::forward<Visitable>(visitable).apply_visitor(visitor); +} +#else template <typename Visitor, typename Visitable> inline BOOST_VARIANT_AUX_APPLY_VISITOR_NON_CONST_RESULT_TYPE(Visitor) @@ -69,6 +80,7 @@ apply_visitor(Visitor& visitor, Visitable& visitable) { return visitable.apply_visitor(visitor); } +#endif #undef BOOST_VARIANT_AUX_APPLY_VISITOR_NON_CONST_RESULT_TYPE @@ -76,6 +88,15 @@ apply_visitor(Visitor& visitor, Visitable& visitable) // const-visitor version: // +#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES +template <typename Visitor, typename Visitable> +inline + BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(typename Visitor::result_type) +apply_visitor(const Visitor& visitor, Visitable&& visitable) +{ + return ::boost::forward<Visitable>(visitable).apply_visitor(visitor); +} +#else template <typename Visitor, typename Visitable> inline BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(typename Visitor::result_type) @@ -83,6 +104,7 @@ apply_visitor(const Visitor& visitor, Visitable& visitable) { return visitable.apply_visitor(visitor); } +#endif #if !defined(BOOST_NO_CXX14_DECLTYPE_AUTO) && !defined(BOOST_NO_CXX11_DECLTYPE_N3276) @@ -139,33 +161,34 @@ struct result_wrapper1 {} template <class T> - result_type operator()(T& val) const { - return visitor_(val); + result_type operator()(T&& val) const { + return visitor_(::boost::forward<T>(val)); } }; }} // namespace detail::variant template <typename Visitor, typename Visitable> -inline decltype(auto) apply_visitor(Visitor& visitor, Visitable& visitable, +inline decltype(auto) apply_visitor(Visitor& visitor, Visitable&& visitable, typename boost::disable_if< boost::detail::variant::has_result_type<Visitor> >::type* = 0) { - boost::detail::variant::result_wrapper1<Visitor, Visitable> cpp14_vis(visitor); - return visitable.apply_visitor(cpp14_vis); + boost::detail::variant::result_wrapper1<Visitor, typename remove_reference<Visitable>::type> cpp14_vis(visitor); + return ::boost::forward<Visitable>(visitable).apply_visitor(cpp14_vis); } template <typename Visitor, typename Visitable> -inline decltype(auto) apply_visitor(const Visitor& visitor, Visitable& visitable, +inline decltype(auto) apply_visitor(const Visitor& visitor, Visitable&& visitable, typename boost::disable_if< boost::detail::variant::has_result_type<Visitor> >::type* = 0) { - boost::detail::variant::result_wrapper1<const Visitor, Visitable> cpp14_vis(visitor); - return visitable.apply_visitor(cpp14_vis); + boost::detail::variant::result_wrapper1<const Visitor, typename remove_reference<Visitable>::type> cpp14_vis(visitor); + return ::boost::forward<Visitable>(visitable).apply_visitor(cpp14_vis); } + #endif // !defined(BOOST_NO_CXX14_DECLTYPE_AUTO) && !defined(BOOST_NO_CXX11_DECLTYPE_N3276) } // namespace boost |