An overloaded operator must take at least one argument of a user-defined type (operators new and delete are an exception). This rule ensures that users cannot alter the meaning of expressions that contain only fundamental types. For example:
k = i + j; //always uses built-in = and +
Recall that enum types are user-defined types, and as such, you can define overloaded operators for them too.