通过引用传递:参数 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,并且有一个长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的指针;引用不能不指向任何对象,必须绑定到左值
- 是否可以从int转换为enum类类型
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 是什么导致了这种使用三进制而不是短整型的有符号int到无符号int转换
- 将字符串中的 int 转换为字母;
- 主.cpp:18:20:错误:从"int*"转换为"int"会失去精度 [-fa
- 将非常大的 int 转换为双倍,在某些计算机上会损失精度
- 如何将矢量<int>转换为字符数组?
- C++ 无法从 const int* 转换为 const_iterator
- 我不断收到错误 C2440'=':无法从"int *(__cdecl *)(int *,int *,int,int)"转换为"int *
- 如何将 int[4] 转换为 std::array<int,4>?
- 如何将data[i].int转换为vaible
- 将 int 转换为字符串,然后连接另一个变量以创建完整扩展名,然后将其转换为 const_char*
- 将私有矩阵形式 int 转换为双 C++
- 无法将参数 1 从 'int' 转换为 'int &'
- 将 int 转换为字符串后始终得到 0
- isspace 函数的性能警告,从 int 转换为布尔值
- 将大 int 转换为浮点数,而不舍入 c++
- 错误:无法将'uint8* {aka unsigned int*}'转换为"常量emxArray_uint8_T*"?
- 将未签名的INT转换为BCD
- 在 C++ 中将 int 转换为双精度