There is no way for the compiler to determine which function you are trying to call, just the return value. Since the return value does not need to be caught, you can write:
hello( 1 ); // return int
hello( 2 ); // return float
This is exactly the same call from what can be seen.
Yes, this is legal, as the first hello accepts the link, and the second hello accepts the memory address. You can call it like this:
hi( myNumber );
hi( &myNumber );
Completely distinguishable.