对重载函数的不明确调用 - int 和 int>

ambiguous call to overloaded function - int and int&

本文关键字:int gt 调用 重载 函数 不明确      更新时间:2023-10-16
void g(int& a)
{
std::cout<<"int&n";
} 
void g(int a)
{
std::cout<<"intn";
}  
int main()
{    
int a = 2;   
g(a); //won't compile (at least under MSVC 2012)
std::cin.ignore();
}

这里有没有一种方法可以避免不明确的调用错误?类似g( static_cast<int&>(a) );

如果可以强制转换,当然有一种方法可以消除调用的歧义:

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

如果你坚持要调用参考版本,那么分辨率就有点棘手了:

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

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

OP不断增加这个问题,我不想再追问了…


是的,是的,你是对的,它涉及到铸造来解决歧义:

#include <iostream>
void g(int& a)
{
std::cout<<"int&n";
} 
void g(int a)
{
std::cout<<"intn";
}  
int main()
{    
int a = 2;   
static_cast< void(*)(int&) >( g )( a );
}

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


修订:Dietmar在他的回答中展示了如何使用const的强制转换来调用按值参数重载。我甚至没有想过,但如果你想这样做(仅限于不考虑参考版本),请使用const_cast而不是static_cast

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

g( +a );

:-)

为了解决重载问题,绑定到正确类型的引用是完全匹配的,就像绑定到正确的非引用一样,因此两个重载相对于左值int参数具有相同的优先级。

可以使第二个过载采用int const &,在这种情况下,它可以以完全相同的方式使用,但将是一个不同的过载。

或者,您可以通过投射函数类型来完全避免过载解析:

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

不过,对于存在歧义的函数的每次调用(即传递左值int时),都必须这样做。

您必须观看此视频。