You cannot overload:
void f(int x) {}
void f(const int& x) {}
Given those, the compiler won't be able to disambiguate the following call:
f(10);
You cannot overload:
void f(int x) {}
void f(int& x) {}
Given those, the compiler won't be able to disambiguate the following call:
int i = 0;
f(i);
You can overload:
void f(int& x) {}
void f(int const& x) {}
Given those, you can use:
int i = 0;
f(i); // Resolves to f(int&)
f(10); // Resolves to f(int const&)