这个函数重载是否正确?

Is this function overloading correct?

考虑在一个 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 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*)参数化;

您的代码将编译但调用

int iTmp; 
a(iTmp);

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

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

将匹配。

原因在于标准:

[over.match.best]

A viable function F1 is defined to be a better function than another viable function F2 if for all arguments i, ICSi(F1) is not a worse conversion sequence than ICSi(F2)

int->int
int->int&

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

他们因此被视为"undistinguishable"。

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