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

C++ 当我为(auto&it:myUnorderedMap){…=std::move(it.second)}时,为什么会得到const引用?,c++,constants,move,auto,stdmove,C++,Constants,Move,Auto,Stdmove,最小重复性示例: 我确实为Movable定义了一个move构造函数,并希望它只被移动,而不被复制,所以它没有使用常规赋值运算符是很好的,我猜它尝试使用它是因为它.second返回常量Movable&而不是Movable&,但为什么呢 我理解它。首先必须是const,因为不能弄乱键,但从值中移动应该是可以的 为什么我要在这里得到一个常量引用,如何修复代码以便移动?它。秒不是常量 问题是,声明移动构造函数的用户不仅删除隐式声明的复制构造函数和复制赋值运算符,而且还禁止隐式声明移动赋值运算符 因此,您

最小重复性示例:

我确实为Movable定义了一个move构造函数,并希望它只被移动,而不被复制,所以它没有使用常规赋值运算符是很好的,我猜它尝试使用它是因为它.second返回常量Movable&而不是Movable&,但为什么呢

我理解它。首先必须是const,因为不能弄乱键,但从值中移动应该是可以的

为什么我要在这里得到一个常量引用,如何修复代码以便移动?

它。秒不是常量

问题是,声明移动构造函数的用户不仅删除隐式声明的复制构造函数和复制赋值运算符,而且还禁止隐式声明移动赋值运算符

因此,您的类没有“移动”赋值运算符,而“复制”赋值运算符被删除,从而导致在尝试将其赋值给另一个可移动对象时出现错误

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

移动作业将成为可能。

it.second不是常量

问题是,声明移动构造函数的用户不仅删除隐式声明的复制构造函数和复制赋值运算符,而且还禁止隐式声明移动赋值运算符

因此,您的类没有“移动”赋值运算符,而“复制”赋值运算符被删除,从而导致在尝试将其赋值给另一个可移动对象时出现错误

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


如果你默认了移动构造函数,你也可以自己默认移动赋值操作符。否则,它将调用已删除的复制分配运算符。在这种情况下,编译器不会为您生成移动赋值运算符

Movable& operator=( Movable && ) = default; // move assignment

如果默认移动构造函数,您可能也希望自己默认移动分配操作符。否则,它将调用已删除的复制分配运算符。在这种情况下,编译器不会为您生成移动赋值运算符

Movable& operator=( Movable && ) = default; // move assignment

@JesperJuhl,我想OP是在问为什么它是常量?我们能得到吗?我确实为PlaneWithPoints定义了一个移动构造函数,并希望它只能移动,不能复制-但是,你也实现了移动赋值操作符吗?错误消息表明您没有。您正试图执行移动分配,但编译器选择使用复制分配运算符,即使该运算符已被删除,这意味着没有可用的移动分配运算符。代码或错误消息中没有任何内容表明这是const的问题。如果希望始终移动某些内容而不复制,则应将复制构造函数和复制赋值运算符声明为=delete,以确保永远不会发生复制。Movable&operator=Movable&&default;会有帮助的。@JesperJuhl,我想OP是在问为什么我们能得到一个常量?我确实为PlaneWithPoints定义了一个移动构造函数,希望它只能移动,不能复制-但是,你也实现了移动赋值操作符吗?错误消息表明您没有。您正试图执行移动分配,但编译器选择使用复制分配运算符,即使该运算符已被删除,这意味着没有可用的移动分配运算符。代码或错误消息中没有任何内容表明这是const的问题。如果希望始终移动某些内容而不复制,则应将复制构造函数和复制赋值运算符声明为=delete,以确保永远不会发生复制。Movable&operator=Movable&&default;会有帮助的。
target[i] = move(it.second);
Movable& operator=(Movable&&) = default;
Movable& operator=( Movable && ) = default; // move assignment