通过引用/值超载传递

kch*_*han 6 c++ overloading reference

试图弄清楚为什么在以下代码中没有引起过载 - 模糊:

float foo2(float& i)
{
    cout << "call from reference" << endl;
    return i;
}
float foo2(float i)
{
    cout << "call from non reference"<<endl;
    return i;
}
int main()
{
    cout<<foo2(2); // print "call from non reference"
}
Run Code Online (Sandbox Code Playgroud)

调用参数未通过引用传递的foo2.为什么?如何调用传递引用参数的foo2?

das*_*ght 7

foo2其参数不是按引用传递被调用.为什么?

因为您不能通过引用传递非常量引用的函数来传递常量或任何计算表达式.要通过引用传递表达式,您需要一个可赋值 - 可以出现在赋值表达式左侧的值.由于2不能出现在赋值表达式的左侧,因此不能用于调用期望引用的函数.引用时const,您可以传递任何内容,因为C++将创建一个临时变量,为其分配表达式,并将引用传递给函数const引用.

如何调用foo2那个传递引用参数?

没有明显的方法可以做到这一点,因为当您传递一个变量或另一个可以成为引用的表达式时,编译器会抱怨您正在进行模糊调用:

float f;
foo2(f); // <<== This will not compile
Run Code Online (Sandbox Code Playgroud)

但是有一种方法可以调用它:你可以创建一个只匹配两个函数签名之一的函数指针,并使用它来进行调用:

typedef float (*fptr_with_ref)(float&);

int main()
{
    cout<<foo2(2) << endl; // print "call from non reference"
    fptr_with_ref foo2ptr(foo2); // Only one overload matches
    float n = 10;
    cout<<foo2ptr(n) << endl; // Calls foo2(float&)
}
Run Code Online (Sandbox Code Playgroud)

演示.


eml*_*lai 4

2作为参数提供的foo2是右值,它不能是引用。因此,接受引用的函数不能用它来调用。