Каково правило, почему это значение указателя не может быть преобразовано в целое число? - PullRequest
0 голосов
/ 05 октября 2018

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

#include <iostream>

int main()
{
    float* pointer = new float;
    long long bigNumber = 1;
    int a = bigNumber; // Allowed
    short b = bigNumber // Allowed
    a = (int)pointer; // Not allowed
    a = (long long)pointer; // Allowed

    return 0;
}

Строка, которую я пометил "Недопустимо "выдает ошибку.В Visual Studio он говорит:

«приведение типа»: невозможно преобразовать из «float *» в «int»

Это понятно, но не объясняет почему.Однако, когда я компилирую код в онлайн-компиляторе C ++ onlinegdb, я получаю следующее сообщение об ошибке для этой строки:

ошибка: приведение из 'float *' к 'int' теряет точность [-fpermissive]

ссылка

Я пробовал в онлайн-компиляторах Ideone, cppbuzz и jdoodle и получаю то же сообщение.Это говорит о том, что причина в том, что это не разрешено, потому что есть потеря точности.Но когда я присваиваю длинную длинную типу int или short, это также приводит к потере точности, но это не дает мне ошибки, из-за чего я думаю, что она нарушает другое правило, а не только потерю точности.

Я видел этот вопрос , в котором верхний ответ говорит, что это недопустимое преобразование без явного приведения, хотя обратите внимание, что это вопрос C, а не C ++.В самом деле, я получаю другое сообщение, если я не приведу явно указатель на int, вместо этого я получаю:

error: недопустимое преобразование из 'float *' в 'int' [-fpermissive]

Без упоминания о потере точности.

Если я установил Visual Studio на 32 бита, эта строка больше не выдает ошибку, потому что размер указателя равен 32 бита, и поэтому intв моем случае.

Мой вопрос: какое правило это предотвращает?Это не может быть просто проблема потери точности, поскольку она допускает потерю точности при назначении длинного long на int или short.

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Ошибка gcc несколько вводит в заблуждение, преобразование не из значения указателя в int, а из типа указателя в int, такое неявное преобразование не допускается.типы указателей могут быть преобразованы в целочисленные типы, достаточно большие для их хранения (например, std::intptr_t).

0 голосов
/ 05 октября 2018

Стандарт C ++ допускает reinterpret_cast от типа указателя к целочисленному типу, только если отображение инъективно.Похоже, что в вашей реализации int недостаточно велико (возможно, потому что int является 32-разрядным, а указатели - 64-разрядными).Поэтому приведение не разрешено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...