通过引用传递:参数 6 没有从 'int' 到 'int&' 的已知转换

pass by reference : no known conversion for argument 6 from 'int' to 'int&'

本文关键字:int 转换 引用 参数      更新时间:2023-10-16

我有一个函数,我通过引用传递一个参数,因为我希望函数编辑它。这个函数在几个地方被调用,我只关心在特定实例中调用时的ref值。伪代码:

test_fn(int a, int b, inc , int d, int e, int& ref)
{
//bunch of other functionalities 
//.
//.
ref = (a*b+c)*(d+e);
}
test_fn(1,2,3,4,5,0)//everywhere that I do not care about ref 
int value = 0;
test_fn(1,2,3,4,5, value)//I care about value here and would use it in the remainder of the code .

为什么不能直接传递0 ?我也尝试传递一个NULL,并且有一个长int到int转换错误。

为什么这是错误的?实现预期结果的最佳方式是什么?

一个常规的int&意味着它已经需要被赋值给一个变量;必须是lvalue

0未赋值给变量;它是一个"自由变量",这意味着它与标签无关。这意味着它是一个rvalue,一个没有绑定到变量的临时变量。用int&&表示

rvalue s可以转换为lvalue s,如果你把它改成const int&。将常量转换为reference to int constant(从右向左读取)是有意义的。

然而,这将是毫无意义的,因为你想要修改变量;因此,答案是遵循您自己的约定,不要传入那些"不存在"并绑定到标签/名称的东西,如常量或移动变量。

考虑这个更简单的例子:

test_fn(int& ref)
{
    ref = 3;
}
int main() {
    test_fn(0);
}

这实际上是试图将0设置为3。即:

int main() {
    0 = 3;
}

但那是胡说八道。int &(与const int&相反)只能接受可修改的内容。

(正如@nogeek001指出的,const int&无论如何都不允许我们修改ref)

为了通过引用传递变量,它必须存在,传递0或NULL意味着您正在发送常量。你不能编辑一个常量的值,因为它实际上不是一个变量。

为了解决你的问题,你可能应该使用指针来实现这一点,然后检查指针是否设置为0,NULL或如果你使用c++ 11, nullptr

正如其他人所说,不能将文字作为引用传递。

你能做的就是传递一个地址,然后检查它在函数内是否为NULL:

test_fn(int a, int b, inc , int d, int e, int* ref)
{
    int someValue = (a*b+c)*(d+e);
    if ( ref )
       *ref = someValue;
}
//...
test_fn(1,2,3,4,5,0);
int value = 0;
test_fn(1,2,3,4,5, &value)

ref是引用而不是指针。如果是,可以传递0,这意味着指向null的指针;引用不能不指向任何对象,必须绑定到左值