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

问题描述 投票:0回答:2

如果

*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;
}
c++ unordered-map assignment-operator
2个回答
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 *)映射,并更改指针处的值而不是尝试更改值本身。

术语是一个删除的函数,因为 C++11

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


0
投票

我刚遇到同样的问题...

auto & map_pair = *map_it;

map_pair的类型是

std::对&

所以,map_pair.first 是不可赋值的!

© www.soinside.com 2019 - 2024. All rights reserved.