Получение ссылки на возвращаемое значение оператора unordered_map [] - PullRequest
0 голосов
/ 11 января 2019

Я хотел бы вставить новые элементы в unordered_map и обновить их значение, если они уже существуют, все за один шаг. Я делаю это с перегрузкой operator[], которая, по словам документации, возвращает ссылку на тип значения карты.

unordered_map<int, size_t> map;
int &element = map[-3];
element++;

Это не компилируется. Однако следующее выполняет и выполняет, как я ожидал (инициализирует значение 1 и увеличивает его, если оно существует):

unordered_map<int, size_t> map;
map[-3]++;

Следующее также компилируется, но не выполняет то, что я ожидаю (это то, что я написал изначально, что привело к ошибке):

unordered_map<int, size_t> map;
auto element = map[-3];
element++;

Компилятор, кажется, указывает, что значение map[-3] является int, а не int&.

Я посмотрел на этот ответ: возвращаемое значение оператора карты [] (и метод "at")

Но в этом случае тип LHS должен быть значением. Как я могу получить [изменчивую] ссылку обратно?

1 Ответ

0 голосов
/ 11 января 2019

Какова стоимость вашей карты? int или size_t?

    unordered_map<int, size_t> map;
    size_t &element = map[-3]; // now it works
    element++;

auto сбрасывает ссылку во время вывода типа, вам нужно использовать decltype(auto) или auto& (что более читабельно), если вы хотите изменить значение в карте

   unordered_map<int, size_t> map;
   decltype(auto) element = map[-3];
   element++; // now it works
...