vs 2013和GCC之间的全局函数和模糊参数NULL与char*

Ste*_*ult 4 c++ gcc visual-c++ c++11

我试图理解当前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;
}
Run Code Online (Sandbox Code Playgroud)

Visual Studio调用f(char*, int)使用默认vs标志GCC给我一个编译器错误:调用重载'f(char*&,NULL)'是不明确的.gcc只使用-std=c++11标志.

T.C*_*.C. 7

这取决于NULL定义的内容.

MSVC将其定义为0,因此int重载是完全匹配并且是首选.

GCC将其定义为编译器内部__null,导致64位的模糊,因为它__null的类型存在long.(看起来它__null的类型是int32位的,所以它int在编译32位时选择过载.)

标准允许NULL定义为任何C++空指针常量,包括nullptr,在这种情况下,它将明确地选择两个指针重载,或者0L,它将再次模糊(从a long到两者intchar *涉及转换).

道德:不要NULL用于空指针.使用nullptr.