今天我遇到了大致如下的代码:
所以它似乎非常有意地将整数转换为浮点数,然后将浮点数转换为整数,但我不知道为什么会这样,也不知道如何在谷歌上搜索相关信息。为什么会发生这种情况?是什么规则导致了这个结果?
#include <iostream>
void f(float&& f) { std::cout << f << "f "; }
void f(int&& i) { std::cout << i << "i "; }
int main()
{
int iv = 2; float fv = 1.0f;
f(2); f(1.0f);
f(iv); f(fv);
}
前两个f-calls打印出了2i 1f
,正如预期的那样。
现在对于第二行,我本来期望它要么根本无法编译,因为iv和fv不是临时变量(因此无法绑定到右值引用),要么它会创建变量的副本传递给函数,因此会再次打印2i 1f
。
然而,不知何故它打印出了2f 1i
,这是我最不期望的结果。
如果你将代码复制到cppinsights中,它会将调用转换为
f(static_cast<float>(iv));
f(static_cast<int>(fv));
所以它似乎非常有意地将整数转换为浮点数,然后将浮点数转换为整数,但我不知道为什么会这样,也不知道如何在谷歌上搜索相关信息。为什么会发生这种情况?是什么规则导致了这个结果?
f(iv);
无法绑定到f(int&&)
,但可以通过临时对象绑定到f(float&&)
。同样地,f(fv)
也是如此。 - undefinedint
不会被“转换”为一个int
,它就是一个int
。因此没有进行转换。正是转换才会产生一个临时变量。你可以通过f(iv+0)
强制生成临时变量(我认为f(+iv)
也可能起作用)。 - undefined