每个 [conv.fpprom] 都有“浮点提升”之类的东西float
。double
类型的纯右值float
可以转换为类型的纯右值double
。值不变。
这种转换称为浮点提升。
链接问题的答案是正确的。float
由于通常的算术转换不会提升浮点操作数,因此在添加两个 s 时不应自动发生此提升。
当将 a作为操作数传递给省略号时,确实会发生浮点提升,例如 in 。这就是格式说明符打印 a或 a的原因:如果您传递 a ,该函数实际上接收 a ,这是提升的结果。float
printf
%f
float
double
float
double
浮点提升的存在在重载解析中也很重要,因为整数提升和浮点提升比整数转换、浮点转换和浮点整数转换具有更好的隐式转换等级。
示例 1:
void f(double);
void f(long double);
f(0.0f);
这调用void f(double)
,因为提升double
比转换为更好long double
。相比之下,考虑这个可能令人惊讶的示例 2:
void f(long double);
void f(int);
f(0.0f);
这是模棱两可的。从float
to的转换long double
并不比从float
to的转换好,int
因为它们都不是促销活动。
示例 3:
struct S {
operator float();
operator int();
};
double d = S();
这调用operator float
然后将结果float
值提升double
为初始化d
。