Действительно зависит от вашей цели.
[expr.reinterpret.cast]
4 Указатель может быть явно преобразованк любому целочисленному типу, достаточно большому для его удержания.Функция отображения определяется реализацией.[Примечание: предполагается, что это не удивительно для тех, кто знает структуру адресации базовой машины.- примечание конца] Значение типа std::nullptr_t
может быть преобразовано в целочисленный тип;преобразование имеет то же значение и допустимость, что и преобразование (void*)0
в целочисленный тип.
5 Значение целочисленного типа или типа перечисления может быть явно преобразовано в указатель.Указатель, преобразованный в целое число достаточного размера (если таковое существует в реализации) и обратно в тот же тип указателя, будет иметь свое первоначальное значение;в противном случае отображения между указателями и целыми числами определяются реализацией.
Отображение определяется реализацией (очевидно).Если вы хотите проверить, что значение pointer
было использовано для инициализации value
, то вашей проверки недостаточно.Вышеприведенное не обещает, что reinterpret_cast<uintptr_t>(pointer)
всегда будет давать одно и то же целое число, даже если все сегодняшние здравомыслящие реализации это делают.
Я бы сделал проверку в обратном порядке, поскольку у нас есть гарантия приема-передачи:
reinterpret_cast<int*>(value) == pointer;
Но даже тогда это довольно слабая гарантия.Я бы не стал слишком много болтать с этими обращениями на вашем месте.Возможно, стоит пересмотреть ваш дизайн.