如何从 const ref 获取键的值?

How do I get the value for a key from a const ref?

为什么我无法在传递给函数的 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 成员,因为它被指定为 插入一个项目 如果键不在地图中。恰好你甚至不需要使用它。

你使用了 find() 然后就丢弃了结果,为什么?如果该项目存在,它会获取该项目的迭代器。所以不要丢弃它,使用它。

auto item = objectParameters.find(CAPABILITY_TYPE_SPECIE);
if (item != objectParameters.end()) {
     auto map2 = item->second;

虽然如果您希望 map2map1 中已有的相同,但上述方法也不会这样做。因为 auto map2item->second 的副本。要修改 map1 中的项目,我们需要使 map2 成为参考:

auto item = objectParameters.find(CAPABILITY_TYPE_SPECIE);
if (item != objectParameters.end()) {
     auto& map2 = item->second;

关于您的编辑,删除 const 到 "fix" 这样的错误是错误的做法。 Const 的正确性很重要,当您执行这样的 "fix" 时,它可能会在您的代码中引入细微的错误。因为现在不应该改变的事情可能会意外地开始改变。

Why can't I get the value from objectParameters ?

因为当使用运算符 [] 访问地图元素并且键不存在时,它将被创建。如果 map 是 const.

显然编译器不能这样做

您可以尝试使用 .at(),因为它有 const 过载 http://en.cppreference.com/w/cpp/container/map/at