'=' : 左操作数必须是 l 值
'=' : left operand must be l-value
本文关键字:操作数 更新时间:2023-10-16
当我编译以下代码时,我在"m.msg_body[i].id = i;"处得到"错误 C2106:'=':左操作数必须是 l 值"。当我注释掉那行时,没有错误。我的代码有什么问题?
static const short MSG_DATA_MAX = 10;
struct MsgBodyData
{
int id;
string value;
};
class MsgBody
{
public:
MsgBody()
{
len = 0;
}
MsgBody(MsgBody & msg_obj);
~MsgBody() {}
int length() { return len; }
void setLength(int _len) { len = _len; }
MsgBodyData operator[](short index)
{
if(index > -1 && index < MSG_DATA_MAX)
return data[index];
MsgBodyData dump_data;
return dump_data;
}
void operator=(MsgBody & msg_obj)
{
len = msg_obj.length();
for(int i = 0; i < len; ++i)
data[i] = msg_obj[i];
}
private:
int len;
MsgBodyData data[MSG_DATA_MAX];
};
MsgBody::MsgBody(MsgBody &msg_obj)
{
operator=(msg_obj);
}
struct Msg
{
int msg_id;
string msg_title;
MsgBody msg_body;
};
void sendMsg()
{
Msg m;
m.msg_id = 1;
m.msg_title = "test_msg";
int size = MSG_DATA_MAX;
for(int i = 0; i < size; ++i)
{
m.msg_body[i].id = i; // HERE I GOT ERROR !!!
m.msg_body[i].value = "test_value";
}
}
您的operator[]
按值返回,这意味着它会创建一个临时副本并返回该副本。 临时是右值。 应修改运算符以返回引用。 实际上,您应该有两个版本,一个是 const 版本,它返回一个 const 引用,另一个是 non-const 版本,它返回一个非 const 引用。
但是,处理超出范围索引的方法必须更改。 您可以抛出异常,也可以将其保留为未定义的行为,只需确保记录它即可。 另一种选择是在类中有一个虚拟的MsgBodyData
对象,当你得到一个错误的索引时,你返回该对象,但这似乎是一个非常愚蠢的设计。
您的operator[]
返回一个临时(右值),这使它的每个成员都成为右值。该语言禁止分配给右值(准确地说,分配给非类类型的右值),这就是错误告诉你的。
这种限制的原因是,由于左侧将在完整表达式的末尾被销毁,因此赋值没有多大意义(临时销毁时会忘记它)。
如果要修改类中保存的元素,则需要返回对存储元素的引用(左值),而不是副本。
相关文章:
- 控制允许动态运行c++的并发操作数
- 为什么C++逐位AND运算符在不同大小的操作数中表现为这样
- 错误 C2679:二进制"<<":未找到采用类型 'std::string_view' 的右侧操作数的运算符(或者没有可接受的转换)
- C++ 带有向量的 IF 计算操作数
- 是否所有C++运算符都接受操作数?
- 一元*运算符的操作数是否期望一个 prvalue
- 与'operator='不匹配(操作数类型'String'且"void")
- 不正确的操作数类型 MSVC
- C2678 二进制 '==':未找到采用 'Card' 类型左操作数的运算符(或者没有可接受的转换)
- 错误:类型"double()"和"double()"的操作数无效到二进制&quo
- 我的运算符重载是否有效<<(流插入)左操作数不是 ostream
- 没有运算符"="与这些操作数匹配,JUCE 窗口演示应用程序
- 如果我在指针中使用 ++ 操作数,我的值就会出错
- 二进制表达式的操作数无效 - 使用 for 和迭代器
- C2679 二进制"<<":未找到采用右操作数类型的运算符
- CPP 运算符重载操作数位置 [] 与 ==
- int* 和 int[] 类型对二进制运算符 + 的操作数无效
- 错误:二进制'operator*' 'float'和'float[0]'类型的操作数无效
- 运算符'<'不能应用于类型 'string' 和 'string' 的操作数
- 非法,左操作数具有类型 'DWORD [29]'