C++ 为什么int被缩小为浮动?

C++ 为什么int被缩小为浮动?,c++,language-lawyer,type-narrowing,C++,Language Lawyer,Type Narrowing,举个例子: #include <iostream> void foo(float) {} int main() { int i{43}; foo(float{i}); return 0; } #包括 void foo(float){} int main() { int i{43}; foo(float{i}); 返回0; } 编译器(clang、msvc)不编译此代码(GCC编译,但带有警告):非常量表达式不能在初始值设定项列表中从“int”缩小为“

举个例子:

#include <iostream>

void foo(float) {}

int main()
{
    int i{43};
    foo(float{i});

    return 0;
}
#包括
void foo(float){}
int main()
{
int i{43};
foo(float{i});
返回0;
}
编译器(clang、msvc)不编译此代码(GCC编译,但带有警告):
非常量表达式不能在初始值设定项列表中从“int”缩小为“float”

float
int
宽时,为什么编译器说
int
被缩小为
float

这是因为float的精度只有7位,尽管它的范围比int大

所以,如果你试图用7位数以上的精度来表示整数,你可能会有一些损失从这个意义上说,它被称为缩小。虽然float的范围比int更宽,但精度较低


此外,浮点表示是近似值——也就是说,它并不表示精确的数字(2的幂除外)。从这个意义上讲,整数也被缩小了。

如果转换为
double
,你会得到同样的错误,尽管在普通实现中
double
的精度高于
int
。你说,由于浮点的不精确性,在你可能使用的任何平台上,
double
可以精确表示每个
int
值(不是近似值,而是精确值)。但是标准仍然称之为缩小,因为它不知道你在哪个平台上运行这个。更多信息请参见副本。我接受这个前提,但我很好奇,有没有这样的平台?我的搜索词有问题。。。