2013和GCC之间的全局函数和不明确的参数NULL与char*

Global functions and ambiguous arguments NULL vs. char* between vs 2013 and GCC

本文关键字:NULL char 参数 函数 GCC 之间 全局 2013 不明确      更新时间:2023-10-16

我正在努力理解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,这将再次是不明确的(因为从longintchar *都涉及转换)。

寓意:不要将NULL用作空指针。使用nullptr