Почему std :: unordered_map не работает с ключом const std :: string? - PullRequest
0 голосов
/ 30 мая 2018

Следующий пример кода не будет компилироваться, однако его можно выполнить для компиляции, удалив спецификатор const перед std::string в качестве неупорядоченного ключа карты.

#include <unordered_map>
#include <utility>
#include <string>
#include <iostream>

int main()
{

    int myint = 5;
    std::unordered_map<const std::string, int*> map;
    map.insert({"string", &myint});
    std::cout << *map.at("string") << std::endl;

    return 0;
}

Почему этот код не компилируетсякогда const std::string используется в качестве ключа, когда std::string работает?

1 Ответ

0 голосов
/ 30 мая 2018

std::unordered_map использует std::hash по умолчанию для хэш-функции.Использует тип ключа для типа шаблона std::hash.<string> специализируется std::hash для std::string, но поскольку тип ключа const std::string, специализация не совпадает, и компиляция не удалась.


Действительно, использование std::unordered_map<std::string, int*> будет делать именно то, что вынеобходимость.Ключ во всех ассоциативных контейнерах уже const для вас, поэтому нет смысла отмечать const в параметрах шаблона.

...