我只是想知道为什么不允许这样做的规则是什么,因为给我的原因还不清楚。
#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”
这很清楚,但没有解释原因。但是,当我在onlinegdb在线C ++编译器上编译代码时,该行出现以下错误消息:
错误:从“ float *”转换为“ int”会失去精度[-fpermissive]
我在Ideone,cppbuzz和jdoodle在线编译器中尝试过,但得到的信息却是相同的。所以说这是因为不允许这样做,因为会降低精度。但是,当我为一个int或short分配一个long long时,这也会导致精度损失,但并没有给我带来错误,这使我认为这正在打破另一条规则,而不仅仅是它失去了精度。
我已经看到了这个question,其中最上面的答案说这是没有显式强制转换的不允许的转换,尽管请注意,这是一个C而非C ++问题。的确,如果我没有显式将指针转换为int,则会得到不同的消息,而是得到:
错误:从“浮动*”到“ int”的无效转换[-fpermissive]
没有提到精度损失。
如果我将Visual Studio设置为32位,则该行不再给出错误,因为指针大小为32位,在我的情况下也是int。
我的问题是防止这种情况发生的规则是什么?这不仅是精度损失的问题,因为在为int或short分配long long时允许精度损失。
答案 0 :(得分:3)
仅当映射是单射的时,C ++标准才允许从指针类型到整数类型的reinterpret_cast
。看来在您的实现中,int
不够大(可能是因为int
是32位而指针是64位)。因此,不允许进行强制转换。
答案 1 :(得分:1)
gcc错误在某种程度上具有误导性,不是从指针值到int的转换,而是从指针类型到int的转换,不允许这种隐式转换。指针类型可以转换为足够容纳它们的整数类型(例如std::intptr_t
)。