Это совершенно не связанные типы для компилятора.Передача указателя типа любого , кроме того, который ожидает аргумент, является ошибкой.
Но даже если компилятор был сделан, чтобы распознать, что этот тип приведения указателя возможен, и сделайте это за васвот почему это было бы плохо ...
C ++ существовал достаточно долго, чтобы int
и long
меняли размер по мере появления новых архитектур ЦП.Размер int
и long
зависит от компилятора и платформы, с которой вы работаете, поэтому приведение int*
в long*
(или наоборот) может привести вас к всевозможным проблемам если они не одинакового размера.
Согласно стандарту C ++ это размеры int
и long
для различных платформ:
type | C++ standard | LP32 | ILP32 | LLP64 | LP64
-------------------------------------------------
int | at least 16 | 16 | 32 | 32 | 32 bits
long | at least 32 | 32 | 32 | 32 | 64 bits
Только с ILP32 и LLP64 можно с уверенностью предположить, что int
и long
имеют одинаковый размер, но поддержка этого предположения в компиляторе позволит вам писать код, который не компилируется и не выполняется безопаснона других платформах.
Наконец, если вам нужна гарантия того, что размер целого числа одинаков для всех платформ, вы можете #include <cstdint>
и использовать такие типы, как int16_t
, uint16_t
, int32_t
и т. Д. Эти целые числа фиксированной ширины доступны с компиляторами, поддерживающими C ++ 11 и более поздние версии.