如果
*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 ;被使用,函数被定义为删除。对已删除函数的任何使用都是病式的(程序将无法编译)。这包括显式调用(使用函数调用运算符)和隐式调用(调用已删除的重载运算符、特殊成员函数、分配函数等)
我刚遇到同样的问题...
auto & map_pair = *map_it;
map_pair的类型是
std::对
所以,map_pair.first 是不可赋值的!