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