[gcc(refs/users/ppalka/heads/libstdcxx-constrained-algos)] Restore some sanity to ranges::__copy_or_move
Patrick Palka
ppalka@gcc.gnu.org
Wed Jan 22 23:22:00 GMT 2020
https://gcc.gnu.org/g:81f873306db3324641327298dfbdffb1347f6203
commit 81f873306db3324641327298dfbdffb1347f6203
Author: Patrick Palka <ppalka@redhat.com>
Date: Wed Jan 22 18:14:05 2020 -0500
Restore some sanity to ranges::__copy_or_move
In particular, don't take the __first argument by forwarding reference, it's not
necessary.
Diff:
---
libstdc++-v3/include/bits/ranges_algo.h | 18 ++++++++++--------
1 file changed, 10 insertions(+), 8 deletions(-)
diff --git a/libstdc++-v3/include/bits/ranges_algo.h b/libstdc++-v3/include/bits/ranges_algo.h
index 2102f8a..bbfb2aa 100644
--- a/libstdc++-v3/include/bits/ranges_algo.h
+++ b/libstdc++-v3/include/bits/ranges_algo.h
@@ -816,21 +816,23 @@ namespace ranges
template<typename _Iter, typename _Out>
using move_result = copy_result<_Iter, _Out>;
- template<bool _IsMove, typename _Iter, typename _Sent, typename _Out>
+ template<bool _IsMove,
+ input_iterator _Iter, sentinel_for<_Iter> _Sent,
+ weakly_incrementable _Out>
requires (_IsMove
- ? indirectly_movable<remove_reference_t<_Iter>, _Out>
- : indirectly_copyable<remove_reference_t<_Iter>, _Out>)
+ ? indirectly_movable<_Iter, _Out>
+ : indirectly_copyable<_Iter, _Out>)
constexpr conditional_t<_IsMove,
- move_result<remove_reference_t<_Iter>, _Out>,
- copy_result<remove_reference_t<_Iter>, _Out>>
- __copy_or_move(_Iter&& __first, _Sent __last, _Out __result)
+ move_result<_Iter, _Out>,
+ copy_result<_Iter, _Out>>
+ __copy_or_move(_Iter __first, _Sent __last, _Out __result)
{
// TODO: implement more specializations to be at least on par with
// std::copy/std::move.
if constexpr (sized_sentinel_for<_Sent, _Iter>)
{
- using _ValueTypeI = iterator_traits<_Iter>::value_type;
- using _ValueTypeO = iterator_traits<_Out>::value_type;
+ using _ValueTypeI = iter_value_t<_Iter>;
+ using _ValueTypeO = iter_value_t<_Out>;
constexpr bool __use_memmove
= (is_trivially_copyable_v<_ValueTypeI>
&& is_same_v<_ValueTypeI, _ValueTypeO>
More information about the Libstdc++-cvs
mailing list