调用具有不同右值引用类型的重载函数时出现意外输出

椎名清*_*名清柠 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)

输出

float Rvalue: 1
int Rvalue: 5
Run Code Online (Sandbox Code Playgroud)

我没有得到预期的输出(应该是“int Rvalue:1”和“float Rvalue:5”),而是观察到相反的顺序。我发现这种行为令人困惑,并且希望了解为什么会发生这种情况。

我确保理解右值引用的概念以及基于它们的重载如何工作。我也尝试过搜索类似的问题,但没有找到任何直接解决此特定情况的问题。

任何指导或解释将不胜感激。预先感谢您的帮助!

son*_*yao 6

左值不能绑定到右值引用,这意味着 for foo(int_x);,void foo(int&& x)不会被调用。int可以转换为float,转换后的临时值是一个右值,并且可以在调用float结果时绑定到右值引用。void foo(float&& x)

类似地,对于foo(float_x);,void foo(int&& x)被调用。

  • 这一定是右值绑定最违反直觉的示例之一,因为编译器会跳过转换环来生成右值。但逻辑结果是它不能绑定到左值(任何有名称的东西) (3认同)