这是C++17关于MoveAssignable的当前描述:
= rv;
如果t和rv不引用同一对象,则在赋值之前,t等同于rv的值,rv的状态未指定。注意:无论t和rv是否引用相同的对象,rv仍必须满足使用它的库组件的要求。这些要求中列出的操作必须按照规定工作,无论rv是否已被移动。对于“rv必须仍然满足使用它的库组件的要求”,这是指什么?
如果t和rv引用同一对象会怎样?在这种情况下,具有MoveAssignable的类型可以/应该做什么?
这个描述的意思是什么?
如果t和rv不引用同一对象,则在赋值之前,t等同于rv的值,rv的状态未指定。注意:无论t和rv是否引用相同的对象,rv仍必须满足使用它的库组件的要求。这些要求中列出的操作必须按照规定工作,无论rv是否已被移动。对于“rv必须仍然满足使用它的库组件的要求”,这是指什么?
如果t和rv引用同一对象会怎样?在这种情况下,具有MoveAssignable的类型可以/应该做什么?
这个描述的意思是什么?
该库不会调用自身的移动赋值操作,因此该类型在这种情况下可以任意处理(甚至崩溃)。
或者该类型应该以某种方式处理此情况(不允许崩溃),但其结果并不重要。
或其他情况?
注意:在SO上有类似的问题,但是有互相矛盾/陈旧的答案和评论,因此我想澄清这一点。
swap
如何实现,并考虑允许自我交换。如果我没记错的话,当前的措辞会使自我移动成为未定义行为,因为弱化了右值引用不能创建非唯一别名的一般规则。 - Kerrek SBx = std::move(x)
是否未定义? - Shafik Yaghmour