powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / C++ [игнор отключен] [закрыт для гостей] / std::unordered_map и ключ const
11 сообщений из 11, страница 1 из 1
std::unordered_map и ключ const
    #40128189
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поясните, пожалуйста, отчего ключ в std::unordered_map не может быть со спецификацией const.

При попытке компиляции например вот такого кода:
Код: plaintext
1.
	    std::unordered_map<const int, int> m2;


Получаю "информативное" сообщение:
Код: plaintext
1.
2.
3.
4.
5.
6.
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.30.30705\include\unordered_map(50,99): error C2280: 'std::_Uhash_compare<_Kty,_Hasher,_Keyeq>::_Uhash_compare(const std::_Uhash_compare<_Kty,_Hasher,_Keyeq> &)': attempting to reference a deleted function
1>        with
1>        [
1>            _Kty=const int,
1>            _Hasher=std::hash<const int>,
1>            _Keyeq=std::equal_to<const int>
1>        ]

Спасибо.
...
Рейтинг: 0 / 0
std::unordered_map и ключ const
    #40128197
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъотчего ключ в std::unordered_map не может быть со спецификацией const.

Вообще-то может. Проблема в стандартном хэшере:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
namespace std
{
template<>
struct hash<const int>
{
   size_t operator()(const int& v) const
   {
     return v;
   }
};
}

int main()
{
   std::unordered_map<const int, int> m2;
   m2.emplace(1, 1);
}


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
std::unordered_map и ключ const
    #40128273
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ,

А зачем?
...
Рейтинг: 0 / 0
std::unordered_map и ключ const
    #40128309
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovsky,

чисто на автомате. Там, где логике вроде бы не мешает const - ставлю const.
...
Рейтинг: 0 / 0
std::unordered_map и ключ const
    #40128413
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ,

хорошо бы компилятор это делал. но это уже раст получится :)
...
Рейтинг: 0 / 0
std::unordered_map и ключ const
    #40128480
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ,

Конкретно в unordered_map и других словарях ключ по-любому нельзя изменять (value_type = std::pair<const Key, T>) так что смысла нет.
...
Рейтинг: 0 / 0
std::unordered_map и ключ const
    #40128501
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovsky
ъъъъъ,

Конкретно в unordered_map и других словарях ключ по-любому нельзя изменять (value_type = std::pair<const Key, T>) так что смысла нет.


Ну вот в std::map я могу писать const тип_ключа, а в std::unordered_map - нет. Что за шовинизьм.
...
Рейтинг: 0 / 0
std::unordered_map и ключ const
    #40128705
a.guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
namespace std
{
template<>
struct hash<const int>
{
   size_t operator()(const int& v) const
   {
     return v;
   }
};
}


C++20 namespace.std1 Unless otherwise specified, the behavior of a C++ program is undefined if it adds declarations or definitions to namespace std or to a namespace within namespace std.
2 Unless explicitly prohibited, a program may add a template specialization for any standard library class template to namespace std provided that (a) the added declaration depends on at least one program-defined type and (b) the specialization meets the standard library requirements for the original template.
...
Рейтинг: 0 / 0
std::unordered_map и ключ const
    #40128735
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никто не запрещает явно указать хэшер при объявлении переменной.
Кроме того, где мы а где С++20...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
std::unordered_map и ключ const
    #40128853
a.guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov
Кроме того, где мы а где С++20...
🤦‍♂️
От C++20 краткое название раздела и формулировка. А подобный запрет существует с C++98.
...
Рейтинг: 0 / 0
std::unordered_map и ключ const
    #40133806
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ
Ну вот в std::map я могу писать const тип_ключа, а в std::unordered_map - нет. Что за шовинизьм.
Если по стеку ошибок посмотреть:
Код: plaintext
1.
	_Conditionally_enabled_hash(const _Conditionally_enabled_hash&) = delete;

В unordered_map в ключах используются хеши.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / std::unordered_map и ключ const
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]