The difference between an operator and an appropriately named function is small enough that in
most (but not all, I'll give you that) cases overloaded operators tend to confuse more than they enlighten.
I've worked for a while on a C++ vector/matrix library which made good use of C++'s capabilities to overload operators. It all made sense, in the beginning. But as time wore on and more and more exceptions crept in you'd get very confusing bits of code where in the same fragment '+' would mean one thing, then another, ditto for '*' and endless frustration when no free operator could be overloaded and in the end you'd end up having to call a function anyway.
Maintaining that over the years got less and less pleasant, even if at the start it was probably some of the cleanest code for the limited purpose that it had.
Personally, I avoid operator overloading, just as I try to avoid reader macros and other clever bits. It's not that I don't know how to use them or how they work, it's that I love being able to look at a piece of code without also having to study the environment it operates in in order to know what it does.
KISS. Though, adding two vectors or multiplying a vector and a matrix with just an operator looks very good. Better than:
result_matrix = vec_mat_mul(some_vec, some_matrix);