На момент фиксации d5e9afc 17 марта 2018 года accumulate.hpp
При передаче диапазона init получает 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 должен быть переопределен в любом случае, верно? Так почему же это не нормально, чтобы сорвать его в первую очередь?
init = invoke(op, std::move(init), invoke(proj, *begin));
invoke
принимает по значению? - person StoryTeller - Unslander Monica   schedule 24.04.2018init
должен быть примитивным типом, поэтому передача по значению может быть более эффективной. - person Galik   schedule 24.04.2018init
в качестве премитива? или оба? - person sandthorn   schedule 24.04.2018