std :: unordered_map - не присваиваемая внутренняя пара.Как? - PullRequest
0 голосов
/ 24 января 2019

Если *map_it возвращает & в std::pair, как это может не сработать? Visual Studio указывает мне на pair& operator=(const volatile pair&) = delete;. Как это работает и какая магия перегрузки происходит здесь?

Найден при попытке реализовать хэш-таблицу. Я хочу, чтобы ключ был постоянным, а значение было изменяемым, а вся пара не была назначаемой. Взглянул на реализацию Visual Studio, и я до сих пор не могу понять это. Я считаю, что это должно быть действительно простое правило, о котором я до сих пор ничего не знаю.

Вот пример:

#include <unordered_map>

int main() {
    std::unordered_map<int, int> map;
    map[1] = 2;
    auto map_it = map.begin();
    auto & map_pair = *map_it;

    // How can they prevent this?
    map_pair = std::pair<int const, int>(1, 2);

    // And this one?
    std::pair<int const, int> p(1, 2);
    map_pair = p;

    return 0;
}

1 Ответ

0 голосов
/ 24 января 2019

Это буквально отключено этим:

pair& operator=(const volatile pair&) = delete;

Вы можете сделать это с методами.Например,

class foo {
    public:
        foo(const foo &) = delete; // disallows copy construction
        foo &operator(foo const &) = delete; // disallows move construction
};

Если вы хотите переопределить значение и используете C ++ 17, вы можете использовать std :: unordered_map :: insert_or_assign ().Я думаю в противном случае вы можете использовать пару (int, int *) сопоставлений и изменять значение по указателю вместо попытки изменить само значение.

Термин является удаленной функцией , поскольку C ++ 11

Если вместо тела функции используется специальный синтаксис = delete;используется, функция определяется как удаленная.Любое использование удаленной функции некорректно (программа не будет компилироваться).Это включает вызовы, как явные (с оператором вызова функции), так и неявные (вызов удаленного перегруженного оператора, специальной функции-члена, функции выделения и т. Д.)

...