gpt4 book ai didi

c++ - 通过引用/值重载传递

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:13:02 25 4
gpt4 key购买 nike

试图找出为什么在以下代码中没有引起重载歧义:

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"
}

调用参数不是引用传递的foo2。为什么?如何调用传递引用参数的foo2?

最佳答案

The foo2 whose parameters not passed by reference is called. Why?

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

How to call the foo2 that pass reference parameters?

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

float f;
foo2(f); // <<== This will not compile

不过,有一种方法可以调用它:您可以制作一个仅匹配两个函数签名之一的函数指针,并使用它进行调用:

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&)
}

Demo.

关于c++ - 通过引用/值重载传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28382052/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com