Когда я пытаюсь использовать static_cast для кастинга двойного* к интервалу*, я получаю следующую ошибку:
invalid static_cast from type ‘double*’ to type ‘int*’
Вот код:
#include <iostream>
int main()
{
double* p = new double(2);
int* r;
r=static_cast<int*>(p);
std::cout << *r << std::endl;
}
Я понимаю, что было бы преобразование задач между двойным и интервалом, но почему там преобразование задач между двойным* и интервалом*?
Помимо указателей, double *
и int *
не имеют ничего общего. То же самое можно сказать и о типах указателей Foo *
и Bar *
на любые непохожие структуры.
static_cast
означает, что указатель исходного типа может использоваться в качестве указателя целевого типа, что требует отношения подтипов.
Вам следует используйте reinterpret_cast
для приведения указателей, т.е.
r = reinterpret_cast<int*>(p);
если вы не хотите взять int
-уровень и посмотреть на double
! Вы получите странный результат, и я не думаю, что это то, что вы хотели. Если вы хотите преобразовать значение , на которое указывает p
, в int
, тогда
*r = static_cast<int>(*p);
Кроме того, r
не является ] выделил , поэтому вы можете выполнить одно из следующих действий:
int *r = new int(0);
*r = static_cast<int>(*p);
std::cout << *r << std::endl;
Или
int r = 0;
r = static_cast<int>(*p);
std::cout << r << std::endl;
Преобразование с плавающей запятой в целое число поддерживается, поэтому int a = static_cast
подойдет. Однако это преобразование - базовые типы данных полностью несовместимы. Вы просите, чтобы среда выполнения преобразовала указатель на 8-байтовую структуру в указатель на 4-байтовую структуру, чего она не может сделать каким-либо значимым образом.
Как уже было сказано, если вы действительно хотите интерпретировать свой double как целое число, int * r = reinterpret_cast
будет работать нормально.
Поскольку вы использовали double *
вместо double
*
после него означает, что вы объявляете указатель, который сильно отличается от обычного double.
C ++ не может безопасно преобразовать static_cast указатель на другой тип указателя, подобный этому.
Если вы хотите сделать что-то подобное, вы должны сначала разыменовать переменную.
r=new int(static_cast<int>(*p));
Вы должны использовать новый
, потому что двойное и целое число не могут находиться в одном и том же пространстве памяти (разумно)
С помощью static_cast <>
можно преобразовать между двойным и целым числом, но не между указателями на разные типы. Вы можете преобразовать любой тип указателя в void *
или из него с помощью static_cast <>
.
Объяснение может заключаться в том, что int *
и double *
часто фактически являются массивами, и реализация не знает, насколько велик массив.