1
Type &Type::operator=(Type &&rhs)
{
if(this == &rhs) //is there any need of self-assignment . 
returh *this ;
}
...
}

//因为它将在 r-value 上调用,所以为什么要自赋值?

4

1 回答 1

3

通常...

假设您的类拥有一个指向它分配的某个缓冲区的指针。现在,在一个幼稚的移动赋值运算符中,您将:

  • 释放自己的缓冲区
  • 将另一个对象的缓冲区指针分配给您的缓冲区指针
  • 将 null 分配给另一个对象的缓冲区指针,并可能将其大小设置为 0

这不会使您取消引用空指针,但是 - 您刚刚丢失了缓冲区中的所有数据,这可能不是您想要的,也不是用户期望的。

... 但不总是

上述规则有一个(狭窄的)例外:移动分配运算符对于自分配是“幂等的”的情况。例如,如果您的赋值运算符仅涉及成员的赋值 - 那么自赋值就像常规赋值一样是安全的(相信成员的自赋值实现是有效的)。什么都不会改变或丢失。

这个规则的例外确实很窄,因为以上对于我给出的示例大部分都是正确的——在这种情况下,您将使用默认的移动赋值运算符。尽管如此,仅仅因为您没有在某人的代码中找到此检查并不意味着存在错误。

于 2018-12-02T12:04:49.943 回答