summaryrefslogtreecommitdiff
path: root/libstdc++-v3/include
diff options
context:
space:
mode:
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2010-11-11 13:10:49 +0000
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2010-11-11 13:10:49 +0000
commit7719751deb0052656f422f3915478d84e4f7c7f3 (patch)
tree050ae8b90da348b14f9b9812f34a3252849c5020 /libstdc++-v3/include
parentef649fb9cc386b7df12a065e92eea14458981b16 (diff)
downloadgcc-7719751deb0052656f422f3915478d84e4f7c7f3.tar.gz
2010-11-11 Paolo Carlini <paolo.carlini@oracle.com>
* include/bits/move.h (forward): Implement N3143, resolving US 90. * testsuite/20_util/forward/a.cc: New. * testsuite/20_util/forward/b.cc: Likewise. * testsuite/20_util/forward/c_neg.cc: Likewise. * testsuite/20_util/forward/d.cc: Likewise. * testsuite/20_util/forward/e.cc: Likewise. * testsuite/20_util/forward/f_neg.cc: Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@166599 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3/include')
-rw-r--r--libstdc++-v3/include/bits/move.h29
1 files changed, 10 insertions, 19 deletions
diff --git a/libstdc++-v3/include/bits/move.h b/libstdc++-v3/include/bits/move.h
index 9329cb491db..f351d01964f 100644
--- a/libstdc++-v3/include/bits/move.h
+++ b/libstdc++-v3/include/bits/move.h
@@ -51,29 +51,20 @@ _GLIBCXX_END_NAMESPACE
_GLIBCXX_BEGIN_NAMESPACE(std)
- /// forward (as per N2835)
- /// Forward lvalues as rvalues.
+ /// forward (as per N3143)
template<typename _Tp>
- inline typename enable_if<!is_lvalue_reference<_Tp>::value, _Tp&&>::type
- forward(typename std::common_type<_Tp>::type& __t)
+ inline _Tp&&
+ forward(typename std::remove_reference<_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;
+ inline _Tp&&
+ forward(typename std::remove_reference<_Tp>::type&& __t)
+ {
+ static_assert(!std::is_lvalue_reference<_Tp>::value, "template argument"
+ " substituting _Tp is an lvalue reference type");
+ return static_cast<_Tp&&>(__t);
+ }
/**
* @brief Move a value.