С++: не может static_cast от double * до int *
Когда я пытаюсь использовать static_cast для приведения double * к int *, я получаю следующую ошибку:
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, но почему возникает проблема преобразования между double * и int *?
Ответы
Ответ 1
Помимо указателей, double*
и int*
не имеют ничего общего. Вы можете сказать то же самое для типов указателей Foo*
и Bar*
для любых разнородных структур.
static_cast
означает, что указатель типа источника может использоваться как указатель типа назначения, для которого требуется отношение подтипа.
Ответ 2
Вы должны использовать 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;
Ответ 3
Поддерживается плавающее преобразование "точка-в-целое", поэтому int a = static_cast<int>(5.2)
отлично. Однако это преобразование - базовые типы данных полностью несовместимы. То, о чем вы просите, - это время выполнения, чтобы преобразовать указатель на 8-байтовую структуру в указатель на 4-байтовую структуру, что не может сделать каким-либо значимым образом.
Чтобы сказать, что если вы действительно хотите интерпретировать свой двойной как целое число, int* r = reinterpret_cast<int*>(p)
будет работать нормально.
Ответ 4
Вы можете конвертировать между двойным и int с помощью static_cast<>
, но не между указателями на разные типы. Вы можете преобразовать любой тип указателя в или из void *
с помощью static_cast<>
.
Обоснованием может быть то, что int *
и double *
часто являются эффективными массивами, а реализация не знает, насколько велик массив.
Ответ 5
Потому что вы использовали double *
вместо double
*
после этого означает, что вы объявляете указатель, который сильно отличается от обычного двойника.
С++ не может безопасно static_cast указать указатель на другой тип указателя.
Если вы хотите сделать это, вы должны сначала разыменовать переменную.
r=new int(static_cast<int>(*p));
Вы должны использовать new
, потому что double и integer не могут находиться в одном и том же пространстве памяти (безопасно)