Гость
Форумы / C++ [игнор отключен] [закрыт для гостей] / std::unordered_map и ключ const / 11 сообщений из 11, страница 1 из 1
20.01.2022, 18:47
    #40128189
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
std::unordered_map и ключ const
Поясните, пожалуйста, отчего ключ в 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
20.01.2022, 19:18
    #40128197
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
std::unordered_map и ключ const
ъъъъъотчего ключ в 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
21.01.2022, 01:18
    #40128273
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
std::unordered_map и ключ const
ъъъъъ,

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

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

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

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

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


Ну вот в std::map я могу писать const тип_ключа, а в std::unordered_map - нет. Что за шовинизьм.
...
Рейтинг: 0 / 0
22.01.2022, 19:18
    #40128705
a.guest
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
std::unordered_map и ключ const
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
22.01.2022, 23:20
    #40128735
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
std::unordered_map и ключ const
Никто не запрещает явно указать хэшер при объявлении переменной.
Кроме того, где мы а где С++20...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.01.2022, 20:45
    #40128853
a.guest
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
std::unordered_map и ключ const
Dimitry Sibiryakov
Кроме того, где мы а где С++20...
🤦‍♂️
От C++20 краткое название раздела и формулировка. А подобный запрет существует с C++98.
...
Рейтинг: 0 / 0
13.02.2022, 11:16
    #40133806
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
std::unordered_map и ключ const
ъъъъъ
Ну вот в std::map я могу писать const тип_ключа, а в std::unordered_map - нет. Что за шовинизьм.
Если по стеку ошибок посмотреть:
Код: plaintext
1.
	_Conditionally_enabled_hash(const _Conditionally_enabled_hash&) = delete;

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


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