#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){ ^
#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
答案 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)
),编译器将无法在第一个和第二个案例中选择。