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

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

我有一个通过引用传递参数的函数,因为我希望该函数对其进行编辑。这个函数在几个地方被调用,我只关心在特定实例调用时的 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 或 NULL 意味着您要发送常量。您不能编辑常量的值,因为它实际上不是变量。

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

一个正则int&意味着它已经需要赋值给一个变量;它必须是 lvalue.

0没有赋值给一个变量;它是一个 "free variable,",这意味着它没有附加到标签上。这意味着它是一个 rvalue,一个未绑定到变量的临时变量。它由 int&&.

表示

rvalues 可以转换为 lvalues 如果你做到 const int&。常量可以转换为 reference to int constant(从右到左读取)是有道理的。

但是,这将毫无意义,因为您想 修改 变量;因此,答案是遵循您自己的约定,不要传入 "existence" 中尚未绑定到 label/name 的内容,例如常量或移动变量。

考虑这个更简单的例子:

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

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

int main() {
    0 = 3;
}

但这是无稽之谈。 int &(相对于 const int&)只能接受可修改的内容。

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

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

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

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