Минимально воспроизводимый пример 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
должен быть константным, поскольку ключи не должны быть перепутаны, но вполне допустимо переходить от значений.
Почему я получаю ссылку на констант здесь и как я могу исправить код, чтобы я мог двигаться?