作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
最少可复制的示例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,因为不能混淆键,但是从值中移出应该没问题。
最佳答案
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/
最少可复制的示例cpp.sh/2nlzz: #include #include #include #include using namespace std; int main() { st
我是一名优秀的程序员,十分优秀!