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));
error: invalid conversion from 'std::nullptr_t*' to 'std::nullptr_t*' [-fpermissive]
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.