今天我大致遇到了以下代码:
\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}\nRun Code Online (Sandbox Code Playgroud)\n\n正如预期的那样,前两个 f 调用 print 2i 1f。
现在对于第二行,我预计它要么根本不编译,因为 iv 和 fv 不是临时变量(因此不能绑定到 r 值引用),要么它创建要传递给函数的变量的副本,从而打印2i 1f再次打印。
然而,不知何故它打印2f 1i,这几乎是我最没想到的事情。
如果将代码复制到 cppinsights 中,它会将调用转换为
\nf(static_cast<float>(iv));\nf(static_cast<int>(fv));\nRun Code Online (Sandbox Code Playgroud)\n所以它看起来非常有意地将整数转换为浮点数,然后将浮点数转换为整数,但我不知道为什么这样做,也不知道如何谷歌。为什么会出现这种情况?导致这个结果的规则是什么?
\n