]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
move.h (forward): Reinstate the N2835 version.
authorPaolo Carlini <paolo.carlini@oracle.com>
Wed, 11 Aug 2010 16:55:33 +0000 (16:55 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Wed, 11 Aug 2010 16:55:33 +0000 (16:55 +0000)
2010-08-11  Paolo Carlini  <paolo.carlini@oracle.com>

* include/bits/move.h (forward): Reinstate the N2835 version.

From-SVN: r163101

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/move.h

index b900bf56565ff793d2bb1416b8e8922dfca1b0d5..c0649d7a43c15bd5606f620e4640901940ddd295 100644 (file)
@@ -1,3 +1,7 @@
+2010-08-11  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       * include/bits/move.h (forward): Reinstate the N2835 version.
+
 2010-08-11  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR libstdc++/42925
index d5243d229be0a787b6469bdf144ae23f09ed9ec7..9329cb491db551763fc65a22e0c82bc1c343bdea 100644 (file)
@@ -51,16 +51,29 @@ _GLIBCXX_END_NAMESPACE
 
 _GLIBCXX_BEGIN_NAMESPACE(std)
   
-  /// forward
-  template<typename _Tp, typename _Up>
-    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<typename _Tp>
+    inline typename enable_if<!is_lvalue_reference<_Tp>::value, _Tp&&>::type
+    forward(typename std::common_type<_Tp>::type& __t)
+    { return static_cast<_Tp&&>(__t); }
+
+  /// Forward rvalues as rvalues.
+  template<typename _Tp>
+    inline typename enable_if<!is_lvalue_reference<_Tp>::value, _Tp&&>::type
+    forward(typename std::common_type<_Tp>::type&& __t)
+    { return static_cast<_Tp&&>(__t); }
+
+  // Forward lvalues as lvalues.
+  template<typename _Tp>
+    inline typename enable_if<is_lvalue_reference<_Tp>::value, _Tp>::type
+    forward(typename std::common_type<_Tp>::type __t)
+    { return __t; }
+
+  // Prevent forwarding rvalues as const lvalues.
+  template<typename _Tp>
+    inline typename enable_if<is_lvalue_reference<_Tp>::value, _Tp>::type
+    forward(typename std::remove_reference<_Tp>::type&& __t) = delete;
 
   /**
    *  @brief Move a value.