为什么我得到一个表达式无法分配错误

时间:2019-05-10 14:33:02

标签: c++

我不明白为什么我从以下代码中收到“无法分配表达式”错误:

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 *和

中的返回类型

2 个答案:

答案 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 + str2it++

您可能会检查std::map::operator[]的返回类型,它是一个左值引用,然后values.list["aaa"]lvalue expression并可以分配。

您可以将其返回类型更改为value_t *&来解决问题。