为什么不能将此指针值转换为整数的规则是什么?

时间:2018-10-05 18:45:07

标签: c++ pointers type-conversion

我只是想知道为什么不允许这样做的规则是什么,因为给我的原因还不清楚。

#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]

     

link

我在Ideone,cppbuzz和jdoodle在线编译器中尝试过,但得到的信息却是相同的。所以说这是因为不允许这样做,因为会降低精度。但是,当我为一个int或short分配一个long long时,这也会导致精度损失,但并没有给我带来错误,这使我认为这正在打破另一条规则,而不仅仅是它失去了精度。

我已经看到了这个question,其中最上面的答案说这是没有显式强制转换的不允许的转换,尽管请注意,这是一个C而非C ++问题。的确,如果我没有显式将指针转换为int,则会得到不同的消息,而是得到:

  

错误:从“浮动*”到“ int”的无效转换[-fpermissive]

没有提到精度损失。

如果我将Visual Studio设置为32位,则该行不再给出错误,因为指针大小为32位,在我的情况下也是int。

我的问题是防止这种情况发生的规则是什么?这不仅是精度损失的问题,因为在为int或short分配long long时允许精度损失。

2 个答案:

答案 0 :(得分:3)

仅当映射是单射的时,C ++标准才允许从指针类型到整数类型的reinterpret_cast。看来在您的实现中,int不够大(可能是因为int是32位而指针是64位)。因此,不允许进行强制转换。

答案 1 :(得分:1)

gcc错误在某种程度上具有误导性,不是从指针值到int的转换,而是从指针类型到int的转换,不允许这种隐式转换。指针类型可以转换为足够容纳它们的整数类型(例如std::intptr_t)。