По состоянию на коммит d5e9afc 17 марта 1998 года из аккумулят.hpp
При прохождении диапазона инициатор получает std::move
один раз, как это.
T operator()(Rng && rng, T init, Op op = Op{}, P proj = P{}) const
{
return (*this)(begin(rng), end(rng), std::move(init), std::move(op),
std::move(proj));
}
Выше код будет вызывать это:
T operator()(I begin, S end, T init, Op op = Op{}, P proj = P{}) const
{
for(; begin != end; ++begin)
init = invoke(op, init, invoke(proj, *begin)); // why do we need this another copy of init?
return init;
}
Интересно, зачем нам эта еще одна копия init перед вызовом call?
Этот инициал должен быть каким-либо образом переопределен, верно? Так почему же не стоит разорвать его?
init = invoke(op, std::move(init), invoke(proj, *begin));