Подтвердить что ты не робот

С++: не может 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 *?

4b9b3361

Ответ 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 не могут находиться в одном и том же пространстве памяти (безопасно)