diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index b900bf56565..c0649d7a43c 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,7 @@ +2010-08-11 Paolo Carlini + + * include/bits/move.h (forward): Reinstate the N2835 version. + 2010-08-11 Paolo Carlini PR libstdc++/42925 diff --git a/libstdc++-v3/include/bits/move.h b/libstdc++-v3/include/bits/move.h index d5243d229be..9329cb491db 100644 --- a/libstdc++-v3/include/bits/move.h +++ b/libstdc++-v3/include/bits/move.h @@ -51,16 +51,29 @@ _GLIBCXX_END_NAMESPACE _GLIBCXX_BEGIN_NAMESPACE(std) - /// forward - template - inline typename - enable_if<((std::is_convertible< - typename std::remove_reference<_Up>::type*, - typename std::remove_reference<_Tp>::type*>::value) - && (!std::is_lvalue_reference<_Tp>::value - || std::is_lvalue_reference<_Up>::value)), _Tp&&>::type - forward(_Up&& __u) - { return static_cast<_Tp&&>(__u); } + /// forward (as per N2835) + /// Forward lvalues as rvalues. + template + inline typename enable_if::value, _Tp&&>::type + forward(typename std::common_type<_Tp>::type& __t) + { return static_cast<_Tp&&>(__t); } + + /// Forward rvalues as rvalues. + template + inline typename enable_if::value, _Tp&&>::type + forward(typename std::common_type<_Tp>::type&& __t) + { return static_cast<_Tp&&>(__t); } + + // Forward lvalues as lvalues. + template + inline typename enable_if::value, _Tp>::type + forward(typename std::common_type<_Tp>::type __t) + { return __t; } + + // Prevent forwarding rvalues as const lvalues. + template + inline typename enable_if::value, _Tp>::type + forward(typename std::remove_reference<_Tp>::type&& __t) = delete; /** * @brief Move a value.