ambiguous call to overloaded function - int and int&

后端 未结 3 1787
伪装坚强ぢ
伪装坚强ぢ 2020-12-07 03:44
void g(int& a)
{
    std::cout<<\"int&\\n\";
} 

void g(int a)
{
    std::cout<<\"int\\n\";
}  

int main()
{    
    int a = 2;   
    g(a); //w         


        
3条回答
  •  再見小時候
    2020-12-07 04:19

    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 
    
    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 );
    

    :-)

提交回复
热议问题