Std::unordered_map с использованием ключа с явным конструкторомC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Std::unordered_map с использованием ключа с явным конструктором

Сообщение Anonymous »

Я пытаюсь скомпилировать этот фрагмент кода, но с Gcc15 и Clang21 он не компилируется.
Он компилируется с gcc 14 и Clang20.
Я хочу создать std::unordered_map и использовать класс с явным конструктором в качестве ключа.

Код: Выделить всё

#include 
#include 

class Key{
public:
explicit Key(){}
explicit Key(unsigned int x):_k{x}
{}
size_t operator()(const Key& p) const {
return p._k;
}
private:
unsigned int _k;

};

int main(int argc, char** argv) {

std::unordered_map m;
return 0;
}
Проблема связана с явной работой клавиш. Удаление явного ключевого слова приводит к компиляции кода.
Это ошибка, о которой сообщает gcc15

Код: Выделить всё

In file included from /cefs/ac/ac576b8994a054d93ddc62cc_gcc-trunk-20251014/include/c++/16.0.0/bits/hashtable.h:37,
from /cefs/ac/ac576b8994a054d93ddc62cc_gcc-trunk-20251014/include/c++/16.0.0/bits/unordered_map.h:33,
from /cefs/ac/ac576b8994a054d93ddc62cc_gcc-trunk-20251014/include/c++/16.0.0/unordered_map:43,
from :1:
/cefs/ac/ac576b8994a054d93ddc62cc_gcc-trunk-20251014/include/c++/16.0.0/bits/hashtable_policy.h: In instantiation of 'constexpr std::__detail::_Hash_code_base::_Hash_code_base() [with _Key = Key; _Value = std::pair; _ExtractKey = std::__detail::_Select1st; _Hash = Key; _RangeHash = std::__detail::_Mod_range_hashing; _Unused = std::__detail::_Default_ranged_hash; bool  = true]':
recursively required from 'std::unordered_map::unordered_map() [with _Key = Key; _Tp = int; _Hash = Key; _Pred = std::equal_to; _Alloc = std::allocator]'
:19:37:
19 |   std::unordered_map m;
|                                     ^
required from here
:19:37:
/cefs/ac/ac576b8994a054d93ddc62cc_gcc-trunk-20251014/include/c++/16.0.0/bits/hashtable_policy.h:1056:62: error: converting to 'Key' from initializer list would use explicit constructor 'Key::Key()'
1056 |       [[__no_unique_address__]] _Hashtable_ebo_helper _M_hash{};
|                                                              ^~~~~~~
:6:14: note: 'Key::Key()' declared here
6 |     explicit Key(){}
|
Как заставить его скомпилироваться новыми компиляторами?

Подробнее здесь: https://stackoverflow.com/questions/797 ... onstructor
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»