此函数重载是否正确

Is this function overloading correct?

本文关键字:是否 重载 函数      更新时间:2023-10-16

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

唯一的问题是函数:

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

你的代码将编译,但调用

int iTmp; 
a(iTmp);

将产生一个不明确的重载解析调用,因为两者都

void a(int val)
{
    cout<<val;
}
void a(int &val)
{
    cout<<val;
}

将匹配。

其原因在于标准:

[过度.匹配.最佳]

如果对于所有参数 i,ICSi(F1) 不是比 ICSi(F2) 更差的转换序列,则可行函数 F1 被定义为比另一个可行函数 F2 更好的函数

int->int
int->int&

这些是标准转换序列,检查整个[over.ics.rank]p3.2列表没有成功,以获得更好的转换序列(两种情况下完全匹配

因此,它们被认为是"无法区分的"。

建议:变量也没有初始化,(如果是自动变量)即使您的代码已编译,输出也将是未定义的。

编译器必须能够知道要调用什么函数。

int i = 12;
a(i);

a(int i)c(int& i) 都是可接受的候选项,编译器会引发错误。

void a(const int& i) { ... }

将遭受同样的问题。

这两个

函数会导致问题

void a(int val)
{
    cout<<val;
}
void a(int &val)
{
    cout<<val;
}

您的呼叫a(iTmp);有两个可能的候选项。编译器应显示这些错误。否则指针参数(int *val)和双参数(double val)都可以。

最明显的问题是

  void a(int val) { 

void a(int& val) { 

iTmp 调用时不明确。

除此之外,根据变量是全局变量还是局部变量,代码使用未初始化的变量 -> UB 以及是否,

void a(int* val) {
   std::cout << val << std::endl;
}

正确超载有待商榷。我假设它应该是std::cout << *val << std::endl;的,但这当然取决于函数应该做什么(尽管打印地址的函数通常会由(void* 或 char*)参数化);