为什么我无法在传递给函数的 const ref unordered_map 中获取键的值,但我可以获取本地 unordered_map 的值?
GameObject(const std::unordered_map<int,std::unordered_map<int,int>>& objectParameters){
if (objectParameters.find(CAPABILITY_TYPE_SPECIE)!=objectParameters.end()) {
//Following line gives an error:
auto map2 = objectParameters[CAPABILITY_TYPE_SPECIE];
//Following line works just fine
std::unordered_map<int,std::unordered_map<int,int>> objectParameters2;
auto map = objectParameters2[CAPABILITY_TYPE_SPECIE];
}
为什么我不能从 objectParameters 中获取值? 编译器报错是:
No viable overloaded operator[] for type 'const std::unordered_map >'
编辑:从类型中删除“const”似乎可以使错误消失。这是为什么 ?
最佳答案
operator[]
是一个非常量成员函数,不能通过 const 引用在您拥有的对象上调用。它不能是 const 成员,因为如果键不在 map 中,它会被指定插入一个项目。碰巧你甚至不需要使用它。
您使用 find()
然后丢弃结果,为什么?如果该项目存在,它会获取该项目的迭代器。所以不要丢弃它,使用它。
auto item = objectParameters.find(CAPABILITY_TYPE_SPECIE);
if (item != objectParameters.end()) {
auto map2 = item->second;
尽管如果您希望 map2
与 map1
中已有的相同,上面的方法也不会这样做。因为 auto map2
是 item->second
的拷贝。要修改 map1
中的项目,我们需要使 map2
成为引用:
auto item = objectParameters.find(CAPABILITY_TYPE_SPECIE);
if (item != objectParameters.end()) {
auto& map2 = item->second;
关于您的编辑,删除 const 以“修复”此类错误是错误的做法。 Const 的正确性很重要,当您进行这样的“修复”时,它可能会在您的代码中引入细微的错误。因为现在不应该改变的事情可能会意外地开始改变。
关于c++ - 如何从 const ref 获取键的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50148543/