椎名清*_*名清柠 7 c++ overloading rvalue-reference lvalue-to-rvalue c++11
当使用不同的右值引用类型调用重载函数时,我在代码中遇到了意外行为。下面的代码片段演示了这个问题:
#include <iostream>
void foo(int&& x)
{
std::cout << "int Rvalue: " << x << std::endl;
}
void foo(float&& x)
{
std::cout << "float Rvalue: " << x << std::endl;
}
int main()
{
int int_x = 1;
float float_x = 5.14f;
foo(int_x);
foo(float_x);
}
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)float Rvalue: 1 int Rvalue: 5
我没有得到预期的输出(应该是“int Rvalue:1”和“float Rvalue:5”),而是观察到相反的顺序。我发现这种行为令人困惑,并且希望了解为什么会发生这种情况。
我确保理解右值引用的概念以及基于它们的重载如何工作。我也尝试过搜索类似的问题,但没有找到任何直接解决此特定情况的问题。
任何指导或解释将不胜感激。预先感谢您的帮助!
左值不能绑定到右值引用,这意味着 for foo(int_x);,void foo(int&& x)不会被调用。int可以转换为float,转换后的临时值是一个右值,并且可以在调用float结果时绑定到右值引用。void foo(float&& x)
类似地,对于foo(float_x);,void foo(int&& x)被调用。