【发布时间】: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]
我在 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