我知道NULL被定义为0。它似乎是一个int
常量,已转换为指针类型。因此,当有两个重载函数时会发生什么:一个重载指针类型,另一个重载int
类型。与nullptr
相比如何工作?
#include <iostream>
using namespace std;
void callMe(int* p)
{
cout << "Function 1 called" << endl;
}
void callMe(int i)
{
cout << "Function 2 called" << endl;
}
int main()
{
callMe(nullptr);
callMe(NULL);
return 0;
}
我知道
callMe(nullptr)
肯定会调用第一个函数。但是callMe(NULL)
将调用哪个函数?我在计算机上编译了此代码。只有一个警告。g++ -std=c++11 nullptr_type.cpp
nullptr_type.cpp: In function 'int main()':
nullptr_type.cpp:44:14: warning: passing NULL to non-pointer argument 1 of 'void callMe(int)' [-Wconversion-null]
callMe(NULL);
^
我的代码编译时没有任何问题,当我运行它时,我看到
callMe(NULL)
调用了Function2。VisualStudio也编译了代码,并调用了Function 2。但是,当我尝试在在线GeeksForGeeks IDE上编译代码时,出现一些编译器错误。
https://ide.geeksforgeeks.org/UsLgXRgpAe
我想知道为什么会发生这些错误。
prog.cpp: In function 'int main()':
prog.cpp:17:13: error: call of overloaded 'callMe(NULL)' is ambiguous
callMe(NULL);
^
prog.cpp:4:6: note: candidate: void callMe(int*)
void callMe(int* p)
^
prog.cpp:9:6: note: candidate: void callMe(int)
void callMe(int i)
^
联机Ideone IDE和联机TutorialsPoint CodingGround IDE会生成相同的错误。这是实际定义的行为吗?
那这种情况呢?哪些函数将在此处调用?
#include <iostream>
using namespace std;
void callMe(int* p)
{
cout << "Function 1 called" << endl;
}
void callMe(char* cp)
{
cout << "Function 2 called" << endl;
}
void callMe(nullptr_t np)
{
cout << "Function 3 called" << endl;
}
void callMe(int i)
{
cout << "Function 4 called" << endl;
}
int main()
{
callMe(nullptr);
callMe(NULL);
return 0;
}
一个更笼统的问题,但我认为这就是要解决的问题:如何在重载函数时知道哪个函数调用是模棱两可的?我想知道在有多个功能是该论点竞争者的情况下该问题的答案。如果只有一个函数,它将采用无错误的参数。但是,当几个函数似乎同样有可能接受该论点时,会发生什么?
链接的问题是关于在C中使用
NULL
的问题。我的问题是关于C ++的问题。 C编程语言没有运算符重载,因此,我涉及的大多数问题仅是C ++特定的问题。================================================== ========================
这是一个相关问题,详细解释了该问题及其解决方案。在那有很多有用的答案。
What are the advantages of using nullptr?
最佳答案
我知道NULL被定义为0。
通常这是不正确的,可以将其定义为nullptr
。可能是0L
。还有其他可能性,例如我尝试过的gcc版本将其定义为__null
,这显然是gcc的空指针常量扩展。
您如何知道重载函数时哪些函数调用是模棱两可的?
通过阅读C标准的“过载分辨率”部分。这是其中最复杂的部分之一。简而言之,对不同的转换序列进行排名,并且某些转换序列的排名高于其他转换序列。有一个介绍on cppreference。callMe(0)
解析为(int)
,因为完全匹配优先于转化。 (调用(int *)
版本需要对指针的整数转换)callMe(nullptr)
解析为(int *)
,因为甚至没有从nullptr
到int
的转换。callMe(NULL)
取决于如何定义NULL。如果是0
或nullptr
,请参见上文。如果0L
,则表示模棱两可,因为需要进行转换才能匹配大小写,并且整数转换的等级与整数到指针的转换相同。等等。
关于c++ - 将NULL作为参数传递时,函数重载如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51391703/