Я просто хочу знать, каково правило для того, почему это не разрешено, поскольку указанная мне причина не совсем ясна.
#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.