This answer relates to the question as it was when I answered.
The OP keeps adding to the question, and I'm not going to chase that…
Yes there is, and yes, you're right that it involves casting to resolve the ambiguity:
#include <iostream>
void g(int& a)
{
std::cout<<"int&\n";
}
void g(int a)
{
std::cout<<"int\n";
}
int main()
{
int a = 2;
static_cast< void(*)(int&) >( g )( a );
}
Note: to run this in Visual Studio and see the result window, either use [Ctrl F5], or place a breakpoint on the last right brace of main and run it in the debugger. But better, just run it from the command line. No need to add a “stop” at the end! :-)
AMENDMENT:
Dietmar showed in his answer how to use a cast to
const to call the by-value argument overload. I didn't even think of that, but if you want to do that (it's limited to cutting off the by-reference version from consideration), do use a
const_cast instead of a
static_cast.
Or better, just make an rvalue expression out of the argument, e.g. by adding a handy little + sign in front,
g( +a );
:-)
g( static_cast<int&>(a) );I expectedg(int& a)be called