unordered_map with reference as value

c++, c++11, reference, stl, unordered-map

Solution

`map` and `unordered_map` are fine with references, here a working example :

#include <iostream>
#include <unordered_map>

using UMap = std::unordered_map<int,int&>;

int main() {
    int a{1}, b{2}, c{3};
    UMap foo { {1,a},{2,b},{3,c} };

    // insertion and deletion are fine
    foo.insert( { 4, b } );
    foo.emplace( 5, d );
    foo.erase( 4 );
    foo.erase( 5 );

    // display b, use find as operator[] need DefaultConstructible
    std::cout << foo.find(2)->second << std::endl;

    // update b and show that the map really map on it
    b = 42;
    std::cout << foo.find(2)->second << std::endl;

    // copy is fine
    UMap bar = foo; // default construct of bar then operator= is fine too
    std::cout << bar.find(2)->second << std::endl;
}

Problem

Is it legal to have an unordered_map with the value type being a reference C++11? For example `std::unordered_map<std::string, MyClass&>` I have managed to get this to compile with VS2013 however I'm not sure whether it's supposed to as it is causing some strange runtime errors. For example `vector subscript out of range` is thrown when trying to `erase` an element. Some googling resulted in finding out that you can't have a vector of references but I can't find anything about an unordered_map. Update Further experimentation has shown that the `vector subscript out of range` was not related to the unordered_map of references as it was a bug in my code.

Original source