reading object from const unordered_map

c++

Solution

The expression `z[5]` calls a non-const member function of the map.

This is because a map's `operator[]` will insert a new element if the key isn't found, so obviously it has to be non-const.

For a `vector` nothing is inserted by `operator[]`, the element must exist already (or you get undefined behaviour, so the equivalent code would access the 6th element of an empty vector, which is not fine!).

To lookup a key without adding it use:

int val = 0;
auto it = z.find(5);
if (it != z.end())
  val = it->second;

Problem

Why am I not allowed to read an object from a constant unordered_map? ``` const unordered_map<int, int> z; int val = z[5]; // compile error ``` The error under clang is the following: ``` error: no viable overloaded operator[] for type 'const unordered_map<int, int>' int val = z[5]; ``` Considering that the equivalent code using a `const vector` works fine I'm somewhat confused why we get this behavior.

Original source