Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

I am trying to understand what the currenct C++14 standard says about resolving an ambiguous function call, mostly because I am seeing a difference between GCC 4.9.1, and Visual Studio 2013 update 3

Here's the code (exactly the same for both MS and 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 calls f(char*, int) using default vs flags GCC gives me a compiler error: call of overloaded 'f(char*&, NULL)' is ambiguous. gcc using only the -std=c++11 flag.

like image 269
Steve Thibault Avatar asked Sep 24 '14 19:09

Steve Thibault


1 Answers

It depends on what NULL is defined to be.

MSVC defines it as 0, so the int overload is an exact match and is preferred.

GCC defines it as the compiler internal __null, causing an ambiguity on 64-bit because __null's type there is long. (It appears that __null's type is int on 32-bit, so it picks the int overload when compiling for 32-bit.)

The standard permits NULL to be defined as any C++ null pointer constant, including nullptr, in which case it would unambigously pick the two pointer overload, or 0L, which would be once again ambiguous (as going from a long to both int and char * involves a conversion).

The moral: Don't use NULL for a null pointer. Use nullptr.

like image 133
T.C. Avatar answered Oct 27 '22 19:10

T.C.