Нет , i
не обязательно любое значение.Результат определяется реализацией. †
Представление указателей в C ++ определяется реализацией, включая представление нулевого указателя.Когда вы назначаете указателю целочисленное значение, равное нулю, вы устанавливаете этот указатель на значение нулевого указателя, определяемое реализацией *1009*, которое не обязательно равно нулю.Результат приведения этого значения к целому числу в силу транзитивности определяется реализацией.
Еще более проблематично то, что отображение, выполненное reinterpret_cast
, в любом случае определяется реализацией.Таким образом, даже если значение нулевого указателя было все биты-ноль, реализация свободна, чтобы сделать результат, что он хочет.Вы только гарантируете, что получите исходное значение, когда вернётесь назад.
После всего сказанного следующее предложение после вашей цитаты содержит примечание:
[Примечание:Он предназначен для тех, кто знает структуру адресации базовой машины.- конец примечания]
Таким образом, даже если конкретные сопоставления не требуются, прагматично вы можете сделать обоснованное предположение.
† Предполагая long
достаточно велик.В C ++ 0x используйте uintptr_t
, опционально определенный в <cstddef>
.