gpt4 book ai didi

c++ - 为什么我要for(auto&it:myUnorderedMap){…= std::move(it.second)}时会得到const引用?

转载 作者:行者123 更新时间:2023-12-01 15:11:00 25 4
gpt4 key购买 nike

最少可复制的示例cpp.sh/2nlzz:

#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>

using namespace std;
int main()
{
struct Movable {
Movable() = default;
Movable ( Movable && ) = default; // move constructor
vector<int> payload;
};
unordered_map<int, Movable> map;
vector<Movable> target(10);
int i = 0;
for(auto& it : map) {
target[i] = move(it.second);
++i;
}
}

给我
19:15: error: use of deleted function 'main()::Movable& main()::Movable::operator=(const main()::Movable&)'
10:10: note: 'main()::Movable& main()::Movable::operator=(const main()::Movable&)' is implicitly declared as deleted because 'main()::Movable' declares a move constructor or move assignment operator

我确实为 Movable定义了一个移动构造函数,并且希望它仅被移动,而不是被复制,因此可以不使用常规赋值运算符,因为它是 it.second返回的是 const Movable &而不是 Movable &,所以我想尝试使用它是很好的选择,但是为什么所以?

我知道 it.first必须是const,因为不能混淆键,但是从值中移出应该没问题。

为什么在这里获得const引用,以及如何修复代码以便可以移动?

最佳答案

it.second不是const

问题在于,用户声明move构造函数不仅删除了隐式声明的副本构造函数和副本赋值运算符,而且禁止了move赋值运算符的隐式声明。

因此,您的类(class)没有移动分配运算符,并且副本分配运算符已删除,从而导致您在尝试将it.second分配给另一个Movable时看到的错误。

target[i] = move(it.second);

是一个赋值表达式,而不是变量定义或其他将调用构造函数的对象的初始化。


Movable& operator=(Movable&&) = default;

上课,就可以进行搬家作业。

关于c++ - 为什么我要for(auto&it:myUnorderedMap){…= std::move(it.second)}时会得到const引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59991802/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com