我不明白为什么我从以下代码中收到“无法分配表达式”错误:
class value_t {
public:
int a;
};
class values_t {
public:
std::map<std::string, value_t *> list;
value_t * operator [] (const std::string & key) { return list[key]; }
value_t * get(const std::string & key) { return list[key]; }
};
int main(int argc, const char * argv[]) {
values_t values;
values.list["aaa"] = new value_t(); // OK
values["aaa"] = new value_t(); // ERROR
values.get("aaa") = new value_t(); // ERROR
return 0;
}
我看不到main
函数的第二行与另一行之间的区别。
如何建议解决方案是更改value_t *和
中的返回类型答案 0 :(得分:4)
values.list["aaa"]
返回对指针的引用,该指针可以分配给该指针。
values["aaa"]
和values.get("aaa")
返回指针本身。
将这两个的返回类型更改为value_t *&
,并保持实现不变。
答案 1 :(得分:3)
operator []
和get
按值返回value_t *
,这意味着values["aaa"]
和values.get("aaa")
均为prvalue expressions,不能分配。
函数调用或重载的运算符表达式,其返回类型为非引用,例如
str.substr(1, 2)
,str1 + str2
或it++
;
您可能会检查std::map::operator[]
的返回类型,它是一个左值引用,然后values.list["aaa"]
是lvalue expression并可以分配。
您可以将其返回类型更改为value_t *&
来解决问题。