diff --git a/libcxx/include/numeric b/libcxx/include/numeric --- a/libcxx/include/numeric +++ b/libcxx/include/numeric @@ -193,7 +193,9 @@ _Tp reduce(_InputIterator __first, _InputIterator __last, _Tp __init) { - return _VSTD::reduce(__first, __last, __init, _VSTD::plus<>()); + for (; __first != __last; ++__first) + __init = _VSTD::plus<>()(__init, *__first); + return __init; } template diff --git a/libcxx/test/std/numerics/numeric.ops/reduce/reduce_init.pass.cpp b/libcxx/test/std/numerics/numeric.ops/reduce/reduce_init.pass.cpp --- a/libcxx/test/std/numerics/numeric.ops/reduce/reduce_init.pass.cpp +++ b/libcxx/test/std/numerics/numeric.ops/reduce/reduce_init.pass.cpp @@ -65,5 +65,16 @@ test >(); test(); + //test for checking std::reduce should not require copy constructor for initial object + { + struct T { + T(int){} + T(T &&){} + T &operator=(T &&){} + T operator+(const T &) const{} + }; + T t[1]{1}; + std::reduce(t, t + 1, T(0)); + } return 0; }