std::unordered_map不可分配的内部对.如何

std::unordered_map non assignable internal pair. How?

本文关键字:内部 如何 可分配 不可分 unordered map std      更新时间:2023-10-16

如果*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;
}

它实际上被禁用了:

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 ; 代替函数体,则该函数定义为已删除。任何对已删除函数的使用都是格式不正确的(程序将无法编译)。这包括显式调用(使用函数调用运算符)和隐式调用(调用已删除的重载运算符、特殊成员函数、分配函数等)