在MoveAssignable的情况下,标准对移动分配给自己有什么看法?

时间:2017-11-14 22:43:12

标签: c++ language-lawyer c++17

这是C ++ 17的MoveAssignable current description

t = rv;

  

如果t和rv没有引用同一个对象,则t等效于   在赋值rv的状态之前的rv的值是未指定的。 [ 注意:   rv必须仍然满足库组件的要求   使用它,无论t和rv是否引用同一个对象。该   这些要求中列出的操作必须按照规定工作   rv已被转移或未转移。 - 结束说明]

" rv必须仍然满足使用它的库组件的要求"参考?

如果t& rv是指同一个对象?在这种情况下,MoveAssignable的类型可以/应该做什么?

描述是否意味着:

  1. 图书馆根本没有调用自己的移动作业,所以在这种情况下类型可以做任何想做的事情(甚至崩溃)

  2. 或类型应以某种方式处理此案例(不允许崩溃),但其结果并不重要

  3. 或其他什么?

  4. 注意:SO上也有类似的问题,但是有相互矛盾的/旧的(C ++ 14有不同的规则)答案,评论,所以我想澄清一下。

1 个答案:

答案 0 :(得分:2)

  

" rv必须仍然满足使用它的库组件的要求"参考?

这是一种迂回的说法,即使rv的状态未指定,它也必须是有效的状态。例如,一种记录“我已经走了”的类型!"如果赋值是需要支持的操作之一,则不允许对后续重新分配进行状态和抛出异常。

  

如果t& rv是指同一个对象?

你已经引用了答案:" rv状态未指定。"这与t是否指向同一对象无关。

  

描述是否意味着:

     
      
  1. 或类型应以某种方式处理此案例(不允许崩溃),但其结果并不重要
  2.   

是的,这个,差不多。