В стандарте С++ 11 я не понимаю, почему использование адреса nullptr запрещено, тогда как одному разрешено брать адрес своих собственных экземпляров std::nullptr_t. Помимо того факта, что nullptr является зарезервированным ключевым словом, есть ли какое-либо обоснование для этого решения?
Просто потому, что меня это забавляет, я попытался обойти это ограничение с помощью следующей функции:
decltype(nullptr)* func(const decltype(nullptr) &nref) noexcept
{
return const_cast<decltype(nullptr)*>(reinterpret_cast<const decltype(nullptr)*>(&nref));
}
Мне пришлось использовать reinterpret_cast для параметра, потому что без него я получал истерическую ошибку:
error: invalid conversion from 'std::nullptr_t*' to 'std::nullptr_t*' [-fpermissive]
Когда я вызываю эту функцию, передавая nullptr напрямую, я каждый раз получаю другой адрес. Назначается ли nullptr динамическим адресом как раз вовремя для сравнений и т. д.? Или (вероятнее всего), возможно, компилятор принудительно создает временную копию базового объекта?
Конечно, все это не является жизненно важной информацией, мне просто интересно, почему было реализовано это конкретное ограничение (и, следовательно, почему я вижу такое поведение).
nullptr
— это значение. Вы не можете взять адрес тех. +1 за сообщение об ошибке. - person chris   schedule 07.01.2013