В стандарте С++ 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 динамически назначать адрес точно в срок для сравнения и т.д.? Или (вероятно, более вероятно), возможно, компилятор заставляет временную копию базового объекта?
Конечно, ни одна из этих данных не является важной информацией, мне просто интересно, почему это конкретное ограничение было реализовано (и, следовательно, почему я вижу поведение, которым я являюсь).