C ++: не может static_cast от double * до int * - PullRequest
16 голосов
/ 19 марта 2010

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

IПонимают, что будут проблемы с преобразованием типа double в тип int, но почему существует проблема преобразования между типом double * и int *?

Ответы [ 5 ]

23 голосов
/ 19 марта 2010

Вы должны использовать 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;
20 голосов
/ 19 марта 2010

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

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

4 голосов
/ 19 марта 2010

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

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

0 голосов
/ 19 марта 2010

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

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

0 голосов
/ 19 марта 2010

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

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

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

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

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

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

...