Как правило, на основе [expr.cast] / 4 , приведение в стиле C в
return (int)_p;
закончится выполнением
return reinterpret_cast<int>(_p);
Теперь, строго говоря, я считаю, что поведение в этом случае на самом деле не определено. Согласно [expr.reinterpret.cast] / 4 :
Указатель может быть явно преобразован в любой целочисленный тип, достаточно большой, чтобы содержать все значения его типа.
Обратите внимание, что стандарт определяет здесь только поведение для случая приведения значения указателя к целочисленному типу, достаточно большому, чтобы содержать любое возможное значение этого типа указателя. Мне не известны какие-либо формулировки в стандарте, которые бы определяли поведение в случае приведения значения указателя к целочисленному типу, который слишком мал, что вы и делаете здесь, поскольку int
недостаточно велико ( в MSVC) для представления значения указателя на 64-битный объект. На практике любой компилятор, о котором я когда-либо слышал, просто генерирует код, который возвращает младшие 32 бита (при условии, что int
имеет ширину 32 бита) адреса, который содержится здесь _p
, но вы, скорее всего, не должны полагаться на что.
В общем, я бы просто избегал приведения указателей к целым числам, если бы вы могли. Если вам действительно нужно, убедитесь, что вы используете целочисленные типы, достаточно большие, чтобы содержать значение указателя. std::intptr_t
или std::uintptr_t
будет моим первым выбором в этом случае.
С учетом всего вышесказанного, имя вашей функции предполагает, что она просто должна возвращать хеш-значение, предположительно для идентификации какого-либо объекта в хеш-таблице. Если это цель, я бы порекомендовал вам просто использовать std::hash
, чтобы вычислить для вас такое значение хеша, а не полагаться на приведение указателей к целочисленным значениям самостоятельно:
virtual std::size_t GetHashCode() override
{
return std::hash<IUnknown*>{}(_p);
}
Пусть std::hash
позаботится о получении хэша для адреса для вас. Вы можете рассчитывать на то, что всегда делаете то, что может быть правильным для получения такого хэша, какой бы целевой платформой ни была & hellip;