C++: не может static_cast от двойного* к интервалу*

Когда я пытаюсь использовать 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;
}

Я понимаю, что было бы преобразование задач между двойным и интервалом, но почему там преобразование задач между двойным* и интервалом*?

17
задан coelhudo 18 March 2010 в 22:50
поделиться

5 ответов

Помимо указателей, double * и int * не имеют ничего общего. То же самое можно сказать и о типах указателей Foo * и Bar * на любые непохожие структуры.

static_cast означает, что указатель исходного типа может использоваться в качестве указателя целевого типа, что требует отношения подтипов.

21
ответ дан 30 November 2019 в 10:39
поделиться

Вам следует используйте 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;
25
ответ дан 30 November 2019 в 10:39
поделиться

Преобразование с плавающей запятой в целое число поддерживается, поэтому int a = static_cast (5.2) подойдет. Однако это преобразование - базовые типы данных полностью несовместимы. Вы просите, чтобы среда выполнения преобразовала указатель на 8-байтовую структуру в указатель на 4-байтовую структуру, чего она не может сделать каким-либо значимым образом.

Как уже было сказано, если вы действительно хотите интерпретировать свой double как целое число, int * r = reinterpret_cast (p) будет работать нормально.

5
ответ дан 30 November 2019 в 10:39
поделиться

Поскольку вы использовали double * вместо double

* после него означает, что вы объявляете указатель, который сильно отличается от обычного double.

C ++ не может безопасно преобразовать static_cast указатель на другой тип указателя, подобный этому.

Если вы хотите сделать что-то подобное, вы должны сначала разыменовать переменную.

r=new int(static_cast<int>(*p));

Вы должны использовать новый , потому что двойное и целое число не могут находиться в одном и том же пространстве памяти (разумно)

-1
ответ дан 30 November 2019 в 10:39
поделиться

С помощью static_cast <> можно преобразовать между двойным и целым числом, но не между указателями на разные типы. Вы можете преобразовать любой тип указателя в void * или из него с помощью static_cast <> .

Объяснение может заключаться в том, что int * и double * часто фактически являются массивами, и реализация не знает, насколько велик массив.

1
ответ дан 30 November 2019 в 10:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: