Examples of function overloading

int f(int x);
int f(char x);
char f(float y);

All of these can co-exist.  The return type is NOT part of the signature.  The computer will know which one to use by looking at the arguments when the function is called.
int k, m, n;
char p, q, r;
float a, b, c;
f(k);  //calls int f(int x);
f(p);  //calls int f(char x);
f(a);  //calls char f(float y);

We can also have
float f(int x, int y);
int f(float x, int y);
int f(int x, float y);

f(k, m);  //calls float f(int x, int y);
f(a, k);  // calls int f(float x, int y);
f(k, a);  // call int f(int x, float y);

We CANNOT also have
char f(char x);  This has the same signature as int f(char x); even though the return type is different.
We CANNOT also have
int f(int & x);  This has the same signature as int f(int x);