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) );
答案 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 );
: - )