我有一个函数,我通过引用传递一个参数,因为我希望函数能够编辑它。在几个地方调用此函数,我只关心在特定实例调用时的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转换错误。
为什么这是错的?在这里实现预期结果的最佳方法是什么?
答案 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&
相对)只能接受可修改的内容。
(正如@ nogeek001指出的那样,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的指针;引用不能指向任何内容,必须绑定到左值。