为什么第一个程序不起作用但第二个程序起作用?第二个为什么输出是它给出的?

时间:2016-03-12 11:30:53

标签: c++ function const overloading

计划1

#include <iostream>
#include<string>

using namespace std;

void fun(const char *a)// passing address of "GeeksForGeeks" by value //
{
cout << "const fun() " << a;
}

void fun(const char *&a){// passing address of "GeeksForGeeks" by reference         //
cout << "const reference fun()" <<a;
}
int main()
{
const char *  ptr = "GeeksforGeeks";
fun(ptr);
return 0;
}

错误显示

In function 'int main()':
17:8: error: call of overloaded 'fun(const char*&)' is ambiguous
 fun(ptr);
        ^
17:8: note: candidates are:
6:6: note: void fun(const char*)
 void fun(const char *a)
      ^
11:6: note: void fun(const char*&)
 void fun(const char *&a){
      ^

计划2

#include <iostream>
#include<string>

using namespace std;

void fun(const char *a)// passing address of "GeeksForGeeks" by value //
{
cout << "const fun() " << a;
}

void fun(const char *&a){// passing address of "GeeksForGeeks" by reference         //
cout << "const reference fun()" <<a;
}
int main()
{
const char * const ptr = "GeeksforGeeks";
fun(ptr);
return 0;
}

输出

  

const fun()GeeksforGeeks

2 个答案:

答案 0 :(得分:2)

在您的第一个版本中,存在歧义,因为--- > User C, User A, User B 类型ptr可以转换为const char*。在第二个版本中,没有歧义,因为此时const char*&的类型为ptr,无法转换为const char* const

一般情况下,const char* &无法转换为C const类型。

C&

答案 1 :(得分:2)

在第一个程序中,您使用指向fun()的指针调用const char。有两个候选者(按价值和参考),编制者无法知道选择哪一个。

在第二个程序中,您使用fun()指针const致电const char。然后编译器可以消除通过引用传递的版本,因为这个重载并不能保证通过引用传递的指针将保持不变。

补充说明:如果第二个函数的签名会给出指针常量保证(又名:void fun(const char * const &a)),编译器将无法在第一个和第二个案例中选择。