std :: unordered_map不可分配的内部对。怎么样?

时间:2019-01-24 00:35:34

标签: c++ unordered-map assignment-operator

如果*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 :(得分:1)

实际上是被此功能禁用的:

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 *)映射,并在指针处更改值,而不是尝试更改值本身。

该术语是deleted function,因为C ++ 11

  

如果特殊语法= delete,而不是函数主体;使用时,该功能定义为已删除。删除功能的任何使用都格式不正确(程序将无法编译)。这包括显式调用(使用函数调用运算符)和隐式调用(对已删除的重载运算符,特殊成员函数,分配函数等的调用)