Just a comment on the proposed signature. While I believe deduced return types are perfectly good for user code, I would avoid them in the standard library. The advantage is that the implementor would not need to explicitly provide the return type, the disadvantage is that the return type of the function cannot be used in an SFINAE context, as it requires the instantiation of the template.
There is a single time where the algorithm is implemented in the library and infinite potential users, some that might break if this was the path taken. So the first overload from Xeo's message would be:
template <typename InputIterator, typename BinOp>
auto accumulate(InputIterator first, InputIterator last, BinOp op) -> decltype(*first);
Now, back to the original problem of adding those overloads. In the current definition the algorithms take a 'init' value that is both the initial value for the count and what will be returned to the user if the range is empty. The naïve implementation shown in this message does not account for an empty range, potentially causing undefined behavior (through the dereference of 'first', that could be easily solved by testing for an empty range before the dereference, but the question of what to return is pending. The natural choice would be a default constructed element of type 'decltype(*first)'. This choice might or not be a good choice depending on what the operator is and how the algorithm is used. Beyond that, and even if the input range is never empty, it will add an extra requirement to all uses of the algorithm, whether the range is empty or not.
Regarding the ambiguity issues of the overloads taking the operator versus a defaulted operator and no default value, these could in most cases be resolved by using SFINAE techniques to detect whether the third argument is callable with two arguments resulting from dereferencing the iterators (this could be a good example of where you could see using the result algorithm in an SFINAE context):
auto x = accumulate(v.begin(), v.end(), accumulate(l.begin(),l.end()));
// aggregate the values in v and l
While this is not a show stopper, they should be taken in consideration while considering the added overloads.
/David