左值需要作为赋值的左操作数(递增引用的变量)C++
Posted
技术标签:
【中文标题】左值需要作为赋值的左操作数(递增引用的变量)C++【英文标题】:lvalue required as left operand of assignment (incrementing a referenced variable) C++ 【发布时间】:2018-08-01 23:07:55 【问题描述】:假设我在 main 中有一个变量,我们称之为 var。 我有一个函数,我希望能够在其中增加 var。
function (int &var)
//Body
&var += 1;
我得到错误:
需要左值作为赋值的左操作数。 我该如何解决这个问题?
编辑:
//In header file:
void addActivities(struct activity activityEntry[], int &activityIndex, int
&activityList);
//In Main:
struct activity activityEntry[LIST_SIZE];
int activityIndex = 0;
int activityList = 0;
//unrelated code...
case 1: addActivities(&activityEntry[activityIndex], activityIndex,
activityList);
//In actual function:
void addActivities(struct activity activityEntry[], int *activityIndex, int
&activityList)
//unrelated code...
activityList += 1;
然后报错:
Program3Main.cpp:(.text+0x12b): undefined reference to `addActivities(activity*, int&, int&)' collect2:错误:ld 返回 1 个退出状态
【问题讨论】:
只需使用var += 1;
我想知道我是否应该投票关闭打字错误。
当我删除 & 时,它告诉我对函数(var)的未定义引用
如果没有minimal reproducible example,很难提出建议。
看起来addActivities()
的函数定义需要三个参数:一个结构数组、一个指向 int 的指针,然后是一个 int(作为引用)。您似乎正在向它传递一个结构数组、一个 int 和另一个 int。这是假设错误是由您直接在//unrelated code...
下方的调用引起的。
当我在参数中将引用的 int 更改为 int& 时,它告诉我:从 int* 到 int 的无效转换。应该更改它的哪个部分以使其匹配? (对于引用的 int?)
【参考方案1】:
从您的函数中的var
前面删除&
:
function (int &var)
//Body
var += 1;
函数内的&
充当地址运算符,这意味着您实际上是在递增var
的地址,而不是它指向的值。
另一种表述方式:使用&
作为参数(就像您使用function(int &var)
所做的那样)意味着您实际上是在传递var
本身,而不是它的值。因此,当您在函数内部增加var
时,您不再需要对它的引用,因为内部函数var
与传递给function()
的var
相同(例如,来自main()
) .
不要忘记函数的返回类型。您还可以使用递增运算符递增 var
,如下所示:
#include <iostream>
void increment(int &var)
var++;
int main()
int num = 0;
increment(num);
increment(num);
std::cout << num << std::endl; // prints 2
【讨论】:
没有返回类型,因为它不是一个真正的函数,为了简单起见,我只是这样做了。当我拿走 & 时,它告诉我对这个变量的未定义引用...... @HannahLouise 我想。只是确保。 @HannahLouise 你能发布给你这个错误的完整例子吗? 整件事情很可怕,但我试图发布相关的部分以上是关于左值需要作为赋值的左操作数(递增引用的变量)C++的主要内容,如果未能解决你的问题,请参考以下文章
c++中的左值和右值,右值引用到底是啥?关于引用这一节看得很迷糊。