27

I learned that nullptr, in addition to being convertible to any pointer type (but not to any integral type) also has its own type std::nullptr_t. So it is possible to have a method overload that accepts std::nullptr_t.

Exactly why is such an overload required?

ildjarn
  • 59,718
  • 8
  • 115
  • 201
Hindol
  • 2,661
  • 1
  • 23
  • 39

3 Answers3

35

If more than one overload accepts a pointer type, an overload for std::nullptr_t is necessary to accept a nullptr argument. Without the std::nullptr_t overload, it would be ambiguous which pointer overload should be selected when passed nullptr.

Example:

void f(int *intp)
{
    // Passed an int pointer
}

void f(char *charp)
{
    // Passed a char pointer
}

void f(std::nullptr_t nullp)
{
    // Passed a null pointer
}
torrey.lyons
  • 5,359
  • 1
  • 19
  • 30
3

There are some special cases that comparison with a nullptr_t type is useful to indicate whether an object is valid.

For example, the operator== and operator!= overloads of std::function could only take nullptr_t as the parameter to tell if the function object is empty. For more details you could read this question.

neuront
  • 8,164
  • 4
  • 37
  • 65
2

Also, what other type would you give it, that doesn't simply re-introduce the problems we had with NULL? The whole point is to get rid of the nasty implicit conversions, but we can't actually change behaviour of old programs so here we are.

Lightness Races in Orbit
  • 358,771
  • 68
  • 593
  • 989