这个函数重载是否正确?

时间:2015-04-30 07:21:24

标签: c++ overloading

考虑在一个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);

5 个答案:

答案 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;
}

参见工作示例:

http://ideone.com/WRZUoW

答案 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的完整列表但没有成功,以获得更好的转化顺序(完全匹配在这两种情况下)

因此,他们被视为“无法区分”#34;

一条忠告:即使您的代码已编译,该变量也未初始化且(如果是自动变量),输出将是未定义的。

答案 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 *)参数化;