std::unordered_map不可分配的内部对.如何
std::unordered_map non assignable internal pair. How?
如果*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 ; 代替函数体,则该函数定义为已删除。任何对已删除函数的使用都是格式不正确的(程序将无法编译)。这包括显式调用(使用函数调用运算符)和隐式调用(调用已删除的重载运算符、特殊成员函数、分配函数等)
我刚刚遇到了同样的问题...
自动和map_pair = *map_it;
map_pair的类型是
std::p air