这个函数重载正确吗? 在一个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; }

这个函数重载正确吗? 在一个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; },c++,overloading,C++,Overloading,唯一的问题是功能: 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); ^ 因为他无法区分两者,如果删除其中一个,编译就会成功 见

唯一的问题是功能:

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;
}
#包括
使用名称空间std;
无效a(int val)
{

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

a(int&i)
c(int&i)
都是可接受的候选者,编译器会抛出错误


将遇到相同的问题。

这两个功能将导致问题

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

最明显的问题是

  void a(int val) { 

使用
iTmp
调用时不明确

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

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

std::cout您的代码将编译,但调用

int iTmp; 
a(iTmp);
将产生一个不明确的重载解析调用,因为

void a(int val)
{
    cout<<val;
}
void a(int &val)
{
    cout<<val;
}
这些是标准的转换序列,检查整个
[over.ics.rank]p3.2
列表是否有更好的转换序列(两种情况下的精确匹配

因此,它们被认为是“不可区分的”


一句忠告:变量也没有初始化(如果是自动变量),即使你的代码编译了,输出也没有定义。

我觉得实现似乎是正确的。有什么实际问题吗?@Codor我也不确定。。这是一个采访问题
A(iTmp)
是amgiguous。会出现什么错误?调用
void a(int-val)
将无法与调用
void a(int-val)区分开来
?第一个和第二个函数是不明确的-它们以完全相同的方式调用,因此无法确定您想要哪一个。变量未初始化,它们可以或不能有0(零/空指针)的值,输出不保证(根据标准)正如示例中所描述的那样!你是对的,我采用了提问者的示例-现在我初始化了它们,很抱歉,因为他[编译器]不能同时区分这两个…嗯..这说得不对。编译器可以明确地区分它们,只是(语言)不允许这样做考虑其中一个比另一个更好,这就是为什么它有歧义的原因。
  void a(int val) { 
void a(int& val) { 
void a(int* val) {
   std::cout << val << std::endl;
}
int iTmp; 
a(iTmp);
void a(int val)
{
    cout<<val;
}
void a(int &val)
{
    cout<<val;
}
int->int
int->int&