Tak i jest to w niektórych przypadkach konieczne. Np Gdy chcemy zdefiniować operacje gdy po lewej stronie stoi typ wbudowany a po prawej klasa:
struct A {
int number = 10;
};
int operator+(int lhs, const A& rhs) {
return lhs + rhs.number;
}
int main() {
cout << 1 + A() << endl;
}
Ograniczenie z typami wbudowanymi jest jedynie takie, że nie możesz nadpisać dla nich operatorów już istniejących, czyli np double + int.
Drugi przypadek jest wtedy gdy po lewej stronie stoi klasa ale nie nasza i nie możemy jej zmodyfikować. Klasyczny przykład to wypisywanie obiektów za pomocą cout (std::ostream):
struct A {
int number = 10;
};
ostream& operator<<(ostream& out, const A& a) {
return out << a;
}
int main() {
cout << A() << endl;
}