【问题标题】:What is the rule for why this pointer value can't be converted to an integer?为什么这个指针值不能转换为整数的规则是什么?
【发布时间】:2019-03-11 07:35:21
【问题描述】:

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

#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 中它说:

'type cast':无法从'float *'转换为'int'

这很清楚,但没有解释原因。但是,当我在 onlinegdb 在线 C++ 编译器上编译代码时,我收到该行的以下错误消息:

错误:从“float*”转换为“int”会丢失精度 [-fpermissive]

link

我在 Ideone、cppbuzz 和 jdoodle 在线编译器上进行了尝试,我得到了同样的信息。所以说原因是因为精度损失而不允许这样做。但是,当我将 long long 分配给 int 或 short 时,这也会导致精度损失,但它不会给我一个错误,这让我认为它违反了另一个规则,而不仅仅是它失去了精度。

我看到了这个question,其中最重要的答案说这是一个不允许的转换,没有显式转换,但请注意这是一个 C,而不是 C++ 问题。事实上,如果我没有明确地将指针转换为 int,我会得到不同的消息,而是会得到:

错误:从‘float*’到‘int’的无效转换[-fpermissive]

没有提到精度损失。

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

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

【问题讨论】:

  • 规则是 C++ 标准不提供从指针到非指针类型的隐式转换。

标签: c++ pointers type-conversion


【解决方案1】:

仅当映射是单射时,C++ 标准才允许将 reinterpret_cast 从指针类型转换为整数类型。在您的实现中,int 似乎不够大(可能是因为int 是 32 位的,而指针是 64 位的)。因此不允许演员表。

【讨论】:

  • 我不明白单射映射是什么意思,但我认为指针类型必须转换为相同大小的整数类型,或者允许与可以表示的相同范围的数字指针类型。
  • @zebrafish 大小相同或更大。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-19
    相关资源
    最近更新 更多