这是C ++ 17的MoveAssignable current description:
t = rv;
如果t和rv没有引用同一个对象,则t等效于 在赋值rv的状态之前的rv的值是未指定的。 [ 注意: rv必须仍然满足库组件的要求 使用它,无论t和rv是否引用同一个对象。该 这些要求中列出的操作必须按照规定工作 rv已被转移或未转移。 - 结束说明]
" rv必须仍然满足使用它的库组件的要求"参考?
如果t
& rv
是指同一个对象?在这种情况下,MoveAssignable的类型可以/应该做什么?
描述是否意味着:
图书馆根本没有调用自己的移动作业,所以在这种情况下类型可以做任何想做的事情(甚至崩溃)
或类型应以某种方式处理此案例(不允许崩溃),但其结果并不重要
或其他什么?
注意:SO上也有类似的问题,但是有相互矛盾的/旧的(C ++ 14有不同的规则)答案,评论,所以我想澄清一下。
答案 0 :(得分:2)
" rv必须仍然满足使用它的库组件的要求"参考?
这是一种迂回的说法,即使rv的状态未指定,它也必须是有效的状态。例如,一种记录“我已经走了”的类型!"如果赋值是需要支持的操作之一,则不允许对后续重新分配进行状态和抛出异常。
如果
t
&rv
是指同一个对象?
你已经引用了答案:" rv
状态未指定。"这与t
是否指向同一对象无关。
描述是否意味着:
- 或类型应以某种方式处理此案例(不允许崩溃),但其结果并不重要
醇>
是的,这个,差不多。