In the C++11 standard, I don't understand the reason why taking the address of nullptr
is disallowed whereas one is allowed to take the address of their own std::nullptr_t
instances. Aside from the fact that nullptr
is a reserved keyword, is there any designated reasoning for this decision?
Simply because it amuses me, I attempted to circumnavigate this restriction with the following function:
decltype(nullptr)* func(const decltype(nullptr) &nref) noexcept
{
return const_cast<decltype(nullptr)*>(reinterpret_cast<const decltype(nullptr)*>(&nref));
}
I had to use reinterpret_cast
on the parameter because without it I was getting the hysterical error:
error: invalid conversion from 'std::nullptr_t*' to 'std::nullptr_t*' [-fpermissive]
When I call this function by passing nullptr directly I get a different address each time. Is nullptr
dynamically assigned an address just-in-time for comparisons and such? Or (probably more likely) perhaps is the compiler forcing a temporary copy of the underlying object?
Of course none of this is vital information, I just find it interesting why this particular restriction was implemented (and subsequently why I am seeing the behavior I am).
It's the same as not being able to take the address of 5
even though you can take the address of an int
after giving it the value 5
. It doesn't matter that there's no alternative value for a nullptr_t
to have.
Values don't have addresses; objects do.
A temporary object is generated when you pass such a value to a const &
parameter, or otherwise bind a value to a const reference, such as by static_cast< T const & >( … )
or declaring a named reference T const & foo = …;
. The address you're seeing is that of the temporary.