Sometimes C++ still surprises me. Consider this code:
If you think it’s wrong and causes a compiler error, you’re wrong.
The function “f1” is not in the scope of “main”, but its argument has a type of the same namespace, causing the function to be located.
This rule is called Argument-dependent name lookup (or Koenig lookup) and it is also very necessary in relation to operators.