The language defines several fundamental types, such as int and double.
Objects are instances of fundamental kinds.
Let's pretend you have:
struct Foo { ... };
You can use non-member functions to overload the operator+ function.
Foo operator+(Foo , int);
Foo operator+(Foo& , int);
Foo operator+(int, Foo);
Foo operator+(int, Foo&);
etc.
One of the parameters in each of these circumstances is a Foo or a Foo&.
Foo const& is another possibility.
You cannot, however, overload it
int operator+(int, int);
because neither argument type is a class or a pointer to a class