基于范围的循环中的const参考不起作用



我以为您可以在C 11中的基于范围的循环中使用const引用,但是当我使用G 编译此代码时:

#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>
int main() {
    std::vector<std::unordered_map<std::string, int> > coordinates {
        {{"x", 50}, {"y", 50}},
        {{"x", 25}, {"y", 75}},
        {{"x", 326}, {"y", 412}},
    };
    for(const auto& i : coordinates) {
        std::cout << "{"x" : " << i["x"] << ", "y" : " << i["y"] << "}n";
    }
}

我得到此错误:

const_error.cc:13:38: error: no viable overloaded operator[] for type 'const
      std::__1::unordered_map<std::__1::basic_string<char>, int,
      std::__1::hash<std::__1::basic_string<char> >,
      std::__1::equal_to<std::__1::basic_string<char> >,
      std::__1::allocator<std::__1::pair<const std::__1::basic_string<char>,
      int> > >'
        std::cout << "{"x" : " << i["x"] << ", "y" : " << i["y"] << "}n";
                                    ~^~~~
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/unordered_map:1131:18: note: 
      candidate function not viable: 'this' argument has type 'const
      std::__1::unordered_map<std::__1::basic_string<char>, int,
      std::__1::hash<std::__1::basic_string<char> >,
      std::__1::equal_to<std::__1::basic_string<char> >,
      std::__1::allocator<std::__1::pair<const std::__1::basic_string<char>,
      int> > >', but method is not marked const
    mapped_type& operator[](const key_type& __k);
                 ^
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/unordered_map:1133:18: note: 
      candidate function not viable: 'this' argument has type 'const
      std::__1::unordered_map<std::__1::basic_string<char>, int,
      std::__1::hash<std::__1::basic_string<char> >,
      std::__1::equal_to<std::__1::basic_string<char> >,
      std::__1::allocator<std::__1::pair<const std::__1::basic_string<char>,
      int> > >', but method is not marked const
    mapped_type& operator[](key_type&& __k);
                 ^
const_error.cc:13:64: error: no viable overloaded operator[] for type 'const
      std::__1::unordered_map<std::__1::basic_string<char>, int,
      std::__1::hash<std::__1::basic_string<char> >,
      std::__1::equal_to<std::__1::basic_string<char> >,
      std::__1::allocator<std::__1::pair<const std::__1::basic_string<char>,
      int> > >'
        std::cout << "{"x" : " << i["x"] << ", "y" : " << i["y"] << "}n";
                                                              ~^~~~
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/unordered_map:1131:18: note: 
      candidate function not viable: 'this' argument has type 'const
      std::__1::unordered_map<std::__1::basic_string<char>, int,
      std::__1::hash<std::__1::basic_string<char> >,
      std::__1::equal_to<std::__1::basic_string<char> >,
      std::__1::allocator<std::__1::pair<const std::__1::basic_string<char>,
      int> > >', but method is not marked const
    mapped_type& operator[](const key_type& __k);
                 ^
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/unordered_map:1133:18: note: 
      candidate function not viable: 'this' argument has type 'const
      std::__1::unordered_map<std::__1::basic_string<char>, int,
      std::__1::hash<std::__1::basic_string<char> >,
      std::__1::equal_to<std::__1::basic_string<char> >,
      std::__1::allocator<std::__1::pair<const std::__1::basic_string<char>,
      int> > >', but method is not marked const
    mapped_type& operator[](key_type&& __k);
                 ^

但是,当我从基于范围的循环中删除const时,它可以正常工作。为什么我的代码不使用const引用罚款?

operator[]不是const。如果不存在密钥,它将在该密钥中添加一个值对象。

使用unordered_map::at而不是。

mapunordered_map[]操作员需要在非const对象上调用,因为如果该键不存在新条目,它将更新对象以插入新条目。p>例如,如果"x"不在地图中,您想发生什么?

  • 创建一个新条目?那么您不能使用const
  • 生成运行时错误?然后使用 find或其他一些函数,这些功能在不潜在修改的情况下而不是[]

最新更新