C++ 无序的_映射不可分配的内部对。怎么用?

C++ 无序的_映射不可分配的内部对。怎么用?,c++,unordered-map,assignment-operator,C++,Unordered Map,Assignment Operator,如果*map\u it将&返回到std::pair,这怎么可能不起作用? VisualStudio将我指向pair&operator=(const volatile pair&)=delete。这是如何工作的?这里发生了什么样的过载魔法 在尝试实现哈希表时找到它。我希望密钥是常量,值是可变的,并且整个密钥对是不可赋值的。查看了VisualStudio的实现,我仍然无法理解它。我相信这一定是一条非常简单的规则,我至今还不知道 下面是一个例子: #include <unordered_map&

如果
*map\u it
&
返回到
std::pair
,这怎么可能不起作用? VisualStudio将我指向
pair&operator=(const volatile pair&)=delete。这是如何工作的?这里发生了什么样的过载魔法

在尝试实现哈希表时找到它。我希望密钥是常量,值是可变的,并且整个密钥对是不可赋值的。查看了
VisualStudio
的实现,我仍然无法理解它。我相信这一定是一条非常简单的规则,我至今还不知道

下面是一个例子:

#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;
}
#包括
int main(){
std::无序地图;
map[1]=2;
自动映射_it=map.begin();
自动映射对=*映射它;
//他们如何防止这种情况?
map_pair=std::pair(1,2);
//这个呢?
std::对p(1,2);
map_对=p;
返回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_或_assign()。否则,我认为您可以使用一对(int,int*)映射,并更改指针处的值,而不是尝试更改值本身

这个术语是a,因为C++11

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


我现在记得在搜索时,您不能分配给常量变量
std::pair
可能正在使用一些
snifae
技巧来禁用
运算符=
,如果它的一个成员恰好是常量。@JoãoPires编译器本身可以自动删除隐式生成的赋值运算符,如果不是所有成员都是可赋值的(除其他原因外)。在这种情况下,用于
std::(无序)映射::值类型的
std::对的
第一个
成员被声明为
const Key
,因此不可赋值,因此如果代码没有明确删除它,编译器可以删除该
值类型的
操作符=
(根据OP的声明,这项工作显然正在进行)。