Why is nullptr a part of the core language, but nullptr_t is a part of STL?
Because it can. A central aim in the C++ standardization process is to alter the core language as little as possible when adding to the language.
nullptr
usurps the use of 0
to mean both a null pointer and, er, zero. Using 0
for both caused problems for obvious reasons, does f(0)
call f(int)
or f(int*)
? So a brand new literal was added to the core language: nullptr
. Its type is simply decltype(nullptr)
so nullptr_t
was added as a short cut:
namespace std {
using nullptr_t = decltype(nullptr);
}
The proposal that introduced nullptr
, N2431, indicates in section 1.1 that it was desirable to not force users to include a header in order to use nullptr
.
It also remarks, "We do not expect to see much direct use of nullptr_t
in real programs". Thus, it was considered preferable to add nullptr_t
to the library rather than create a new keyword only to be used for this obscure purpose. In addition, if you don't want to include the header, you can always just write decltype(nullptr)
yourself.