我正在努力理解currenct C++14标准对解决不明确的函数调用的规定,主要是因为我看到了GCC 4.9.1和Visual Studio 2013更新3 之间的差异
以下是代码(MS和GCC完全相同):
#include <iostream>
using namespace std;
void f(char *str, int chars) { cout << "f(char*, int)"; }
void f(char *first, char *second) { cout << "f(char*, char*)"; }
int main()
{
char *hello = "Hello, World";
f(hello, NULL); //which f gets called?
char c; cin.get(c);
return 0;
}
Visual Studio使用默认vs标志调用f(char*, int)
GCC给了我一个编译器错误:重载的"f(char*&,NULL)"的调用不明确。仅使用CCD_ 2标志的gcc。
这取决于NULL
的定义。
MSVC将其定义为0
,因此int
重载是完全匹配的,并且是优选的。
GCC将其定义为编译器内部__null
,导致64位上的歧义,因为__null
的类型为long
。(在32位上,__null
的类型似乎是int
,因此在编译32位时会选择int
重载。)
该标准允许将NULL
定义为任何C++空指针常量,包括nullptr
,在这种情况下,它将明确地选择双指针重载或0L
,这将再次是不明确的(因为从long
到int
和char *
都涉及转换)。
寓意:不要将NULL
用作空指针。使用nullptr
。