From: Paolo Carlini Date: Wed, 11 Aug 2010 16:55:33 +0000 (+0000) Subject: move.h (forward): Reinstate the N2835 version. X-Git-Tag: releases/gcc-4.6.0~5109 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4c7aaebf4ddfac97a1c24373b0eb15ff8477fee7;p=thirdparty%2Fgcc.git move.h (forward): Reinstate the N2835 version. 2010-08-11 Paolo Carlini * include/bits/move.h (forward): Reinstate the N2835 version. From-SVN: r163101 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index b900bf56565f..c0649d7a43c1 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 d5243d229be0..9329cb491db5 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.