diff options
author | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-11-11 13:10:49 +0000 |
---|---|---|
committer | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-11-11 13:10:49 +0000 |
commit | 7719751deb0052656f422f3915478d84e4f7c7f3 (patch) | |
tree | 050ae8b90da348b14f9b9812f34a3252849c5020 /libstdc++-v3/include | |
parent | ef649fb9cc386b7df12a065e92eea14458981b16 (diff) | |
download | gcc-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.h | 29 |
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. |