【问题标题】:const reference in range-based-for-loop not working基于范围的循环中的常量引用不起作用
【发布时间】:2017-04-26 01:30:02
【问题描述】:

我以为你可以在 C++11 的 ranged-based-for-loops 中使用 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);
                 ^

但是当我从基于范围的 for 循环中删除 const 时,它工作得很好。为什么我的代码不能用 const 引用编译好?

【问题讨论】:

  • 这个问题与for循环无关。您可以进一步缩小范围。

标签: c++ c++11 reference ranged-loops


【解决方案1】:

operator[] 不是常量。如果键不存在,它会向该键添加一个值对象。

请改用unordered_map::at

【讨论】:

    【解决方案2】:

    mapunordered_map[] 运算符需要在非常量对象上调用,因为如果该键不存在,它将更新对象以插入新条目。

    如果"x" 不在地图中,你想发生什么?

    • 创建一个新条目?那你就不能用const了。
    • 产生运行时错误?然后使用find 或其他一些在不修改地图的情况下查找地图的函数,而不是[]

    【讨论】:

      猜你喜欢
      • 2016-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-04
      • 1970-01-01
      相关资源
      最近更新 更多