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

时间:2015-07-21 20:32:56

标签: c++ pass-by-reference

我有一个函数,我通过引用传递一个参数,因为我希望函数能够编辑它。在几个地方调用此函数,我只关心在特定实例调用时的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,并且有一个long int到int转换错误。

为什么这是错的?在这里实现预期结果的最佳方法是什么?

5 个答案:

答案 0 :(得分:3)

常规int&表示需要将其分配给变量;它必须是lvalue

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

rvalue如果你lvalue可以转换为const int& s。有意义的是,常量可以转换为reference to int constant(从右到左阅读)。

然而,这是毫无意义的,因为你想修改变量;因此,答案是遵循自己的惯例,不要传递尚未存在的事物。并绑定到标签/名称,如常量或移动变量。

答案 1 :(得分:3)

考虑这个更简单的例子:

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

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

int main() {
    0 = 3;
}

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

(正如@ n​​ogeek001指出的那样,const int&不允许我们修改ref。)

答案 2 :(得分:2)

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

至于解决你的问题,你应该使用指针来实现它,然后检查指针是否设置为0,NULL或者如果你使用C ++ 11,nullptr

答案 3 :(得分:1)

正如其他人所说,你不能传递文字作为参考。

您可以做的是传递一个地址,然后在函数中检查它是否为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)

答案 4 :(得分:0)

ref是引用而不是指针。如果是,则可以传递0,表示指向null的指针;引用不能指向任何内容,必须绑定到左值。