考虑在一个C ++程序中使用这四个函数:
void a(int val)
{
cout<<val;
}
void a(int &val)
{
cout<<val;
}
void a(int *val)
{
cout<<val;
}
void a(double val)
{
cout<<val;
}
我遇到的问题很少:
代码中是否会出现任何错误?或者它们都没有任何错误地重载 你能告诉我如何正确地调用所有这四个功能吗?我的尝试如下:
int iTmp;
int *pTmp;
double dTmp;
a(iTmp);
a(iTmp);
a(pTmp);
a(dTmp);
答案 0 :(得分:3)
唯一的问题是功能:
void a(int &val)
和
void a(int val)
编译器将创建以下错误:
Compilation error time: 0 memory: 3140 signal:0
prog.cpp: In function 'int main()':
prog.cpp:28:8: error: call of overloaded 'a(int&)' is ambiguous
a(iTmp);
^
因为他无法区分两者,如果你删除其中一个编译成功
参见示例:
#include <iostream>
using namespace std;
void a(int val)
{
cout<<val;
}
void a(int *val)
{
cout<<val;
}
void a(double val)
{
cout<<val;
}
int main() {
int iTmp = 0;
int *pTmp = 0;
double dTmp = 0.0;
a(iTmp);
a(iTmp);
a(pTmp);
a(dTmp);
return 0;
}
参见工作示例:
答案 1 :(得分:2)
您的代码将编译但调用
int iTmp;
a(iTmp);
将导致模糊的重载决策调用
void a(int val)
{
cout<<val;
}
void a(int &val)
{
cout<<val;
}
将匹配。
原因在于标准:
[over.match.best]
如果对于所有参数i,可行函数F1被定义为比另一个可行函数F2更好的函数,ICSi(F1)不是比ICSi(F2)更差的转换序列
int->int
int->int&
这些是标准转换序列,检查[over.ics.rank]p3.2
的完整列表但没有成功,以获得更好的转化顺序(完全匹配在这两种情况下)
一条忠告:即使您的代码已编译,该变量也未初始化且(如果是自动变量),输出将是未定义的。
答案 2 :(得分:0)
编译器必须能够知道要调用的函数。
用
int i = 12;
a(i);
a(int i)
和c(int& i)
都是可接受的候选者,编译器会抛出错误。
和
void a(const int& i) { ... }
会遇到同样的问题。
答案 3 :(得分:0)
这两个功能会导致问题
void a(int val)
{
cout<<val;
}
void a(int &val)
{
cout<<val;
}
您的电话a(iTmp);
有两个可能的候选人。编译器应该显示错误。否则指针参数(int *val
)和双参数(double val
)是可以的。
答案 4 :(得分:0)
最明显的问题是
void a(int val) {
和
void a(int& val) {
使用iTmp
调用时,不明确。
除此之外,根据变量是全局变量还是本地变量,代码使用未初始化的变量 - &gt; UB和是否,
void a(int* val) {
std::cout << val << std::endl;
}
正确超载是争论的焦点。我假设它应该是std::cout << *val << std::endl;
,但这当然取决于函数应该做什么(尽管打印地址的函数通常由(void *或char *)参数化;