模糊调用重载函数 - int和int&

时间:2012-11-13 20:44:18

标签: c++ reference overloading

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

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

int main()
{    
    int a = 2;   
    g(a); //won't compile (at least under MSVC 2012)

    std::cin.ignore();
}

有没有办法避免模糊的呼叫错误?像g( static_cast<int&>(a) );

这样的东西

3 个答案:

答案 0 :(得分:10)

如果你可以施放,当然有一种消除呼叫歧义的方法:

g(const_cast<int const&>(a));

如果你坚持要求参考版本,分辨率会有点棘手:

static_cast<void(*)(int&)>(g)(a);

答案 1 :(得分:3)

出于重载解析的目的,绑定到正确类型的引用是完全匹配,就像绑定到正确类型的非引用一样,因此两个重载相对于左值具有相同的优先级{{ 1}}论证。

可以使第二次重载成为int,在这种情况下,它可以以完全相同的方式使用,但将是一个明显的重载。

或者,您可以通过强制转换函数类型来完全避免重载解析:

int const &

但是,对于存在歧义的函数的每次调用都必须这样做(例如,当传递左值static_cast<void(&)(int)>(g)(a); static_cast<void(&)(int&)>(g)(a); 时)。

此视频为mandatory viewing

答案 2 :(得分:3)

这个答案与我回答时的问题有关。

OP不断添加问题,我不打算追逐......


是的,是的,你是对的,它涉及投射以解决歧义:

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

注意:要在Visual Studio中运行并查看结果窗口,请使用[Ctrl F5],或在main的最后一个右括号上放置一个断点并在调试器中运行它。但更好的是,只需从命令行运行它。最后无需添加“停止”! : - )

<小时/> 的修订Dietmar showed in his answer如何使用强制转换来const调用by-value参数重载。我甚至没有想到这一点,但是如果你想这样做(它仅限于从考虑中删除参考版本),请使用const_cast而不是static_cast

或者更好的是,只需从参数中创建一个右值表达式,例如通过在前面添加一个方便的小+符号,

    g( +a );

: - )