I can't see anything dangerous about operator overloading. Operator overloading is nice, useful but not essential. There are many languages that doesn't have it.
Operator overloading is absolutely essential for C++, because C++ standard library (and boost and other post-1998 libraries) use the same code to operate on both user-defined and built-in types: if a template function expects to be able to add its arguments with a+b, the types of a and b should either be built-in arithmetic types or user-defined types that overload operator+.
To give some examples of operators that C++ expects user-defines types to overload:
operator= for regular types (it is so common, C++ will do it for you)
operator<< and operator>> for streamable types
operator() for callbacks and other function objects
operator< for ordered types such as keys in maps
operator== for equality-comparable types (such as keys in hash tables)
operator*, ->, == , <, etc for smart pointer types
operator*, ->, ++, ==, etc for iterator types
operator[] for container types
operators+,-,+=,-= etc for arithmetic types such as time, fractions, etc