C ++ std :: unordered_set find / count / содержит ссылку на постоянный ключ - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть std::unordered_set<int *> (в моем реальном коде я использую указатели на класс, но int * работает и для этого примера) и хочу проверить, хранится ли данный указатель в этом наборе. Так как функция contains будет доступна только для C ++ 20, я использую функцию size_type count( const Key& key ) const.

Если я сейчас ищу константный указатель вместо указатель, компиляция завершается с сообщением error: invalid conversion from ‘const int*’ to ‘std::unordered_set<int*>::key_type {aka int*}’ [-fpermissive]

Пример кода:

#include <unordered_set>

int main() {
    std::unordered_set<int *> set {};

    int foo = 42;
    set.insert(&foo);

    int *pointer = &foo;
    set.count(pointer); // works fine

    const int *const_pointer = pointer;
    set.count(const_pointer); // doesn't work
    set.count(const_cast<int *>(const_pointer)); // works fine

    return 0;
}

Я использую g++ (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0 с C ++ 11.

Is Есть ли способ избежать этого уродливого const_cast<>? Эта ошибка кажется мне совершенно неважной ...

1 Ответ

0 голосов
/ 13 апреля 2020

На мой взгляд, это ограничение C ++.

Хотя существует очевидное сравнение тривиального равенства между int* и const int*, механизм ассоциативного контейнера "не знает" «что, если вы не настроите прозрачный компаратор для своей карты.

Для неупорядоченного ассоциативного контейнера, такого как ваш, вам также понадобится прозрачный га sh (аналогичный принцип).

В этом случае, если честно, для простоты я бы просто придерживался const_cast.

...