小编use*_*756的帖子

整数参数调用浮点重载和浮点参数调用整数重载

今天我大致遇到了以下代码:

\n
#include <iostream>\n\nvoid f(float&& f) { std::cout << f << "f "; }\nvoid f(int&& i) { std::cout << i << "i "; }\n\nint main()\n{\n    int iv = 2; float fv = 1.0f;\n    f(2);  f(1.0f);\n    f(iv); f(fv);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

神箭链接

\n

正如预期的那样,前两个 f 调用 print 2i 1f

\n

现在对于第二行,我预计它要么根本不编译,因为 iv 和 fv 不是临时变量(因此不能绑定到 r 值引用),要么它创建要传递给函数的变量的副本,从而打印2i 1f再次打印。

\n

然而,不知何故它打印2f 1i,这几乎是我最没想到的事情。

\n

如果将代码复制到 cppinsights 中,它会将调用转换为

\n
f(static_cast<float>(iv));\nf(static_cast<int>(fv));\n
Run Code Online (Sandbox Code Playgroud)\n

所以它看起来非常有意地将整数转换为浮点数,然后将浮点数转换为整数,但我不知道为什么这样做,也不知道如何谷歌。为什么会出现这种情况?导致这个结果的规则是什么?

\n

c++ overloading reference rvalue-reference lvalue-to-rvalue

11
推荐指数
1
解决办法
205
查看次数