Гарантируется ли целочисленный тип IntT
, такой что sizeof(IntT) == sizeof(void*)
, и переменная указанного типа i
, что reinterpret_cast<IntT>(reinterpret_cast<void*>(i)) == i
? Это похоже на этот вопрос, но этот вопрос рассматривал любое целое число произвольного размера, поэтому ответ был прямым «нет». Ограничение его целыми числами точно такого же размера, как указатель, делает его более интересным.
Мне кажется, что ответ должен быть «да», потому что в спецификации указано, что существует отображение на любое целое число, достаточно большое для хранения значения указателя. Если переменные имеют одинаковый размер, то это отображение должно быть биективным. Если оно биективно, то это также означает, что преобразование из int
в void*
также должно быть биективным.
Но есть ли в этой логике дыра? Есть ли в спецификации слово, которое я не учитываю?
std::intptr_t
/std::uintptr_t
(если существует) может содержать указатель. - person Jarod42   schedule 12.10.2018void*
, поэтому не каждое целое число должно быть затронуто преобразованием в этом направлении. - person Davis Herring   schedule 12.10.20182 ** (sizeof(void*))
действительных (void*
) указателей. - person Jarod42   schedule 12.10.2018CHAR_BIT
, но идея у тебя правильная - person Ben Voigt   schedule 12.10.20182 ** (sizeof(void*))
, поскольку многим программам требуется более 16 или 256 допустимых значений указателя. :-) (2 ** (CHAR_BIT * sizeof(void*))
было бы ближе к разумному пределу) - person ShadowRanger   schedule 12.10.20182 ** (CHAR_BIT * sizeof(void*))
). - person Jarod42   schedule 12.10.2018