通过引用传递:参数 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&&
.
表示
rvalue
s 可以转换为 lvalue
s 如果你做到 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)
我有一个通过引用传递参数的函数,因为我希望该函数对其进行编辑。这个函数在几个地方被调用,我只关心在特定实例调用时的 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&&
.
rvalue
s 可以转换为 lvalue
s 如果你做到 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)