【发布时间】:2019-05-03 21:37:09
【问题描述】:
Type &Type::operator=(Type &&rhs)
{
if(this == &rhs) //is there any need of self-assignment .
returh *this ;
}
...
}
//既然会在r-value上调用,那为什么要自赋值呢??
【问题讨论】:
-
Type a; a = std::move(a);从技术上讲,它在任何时候都不是必需的,但在 Rule-of-[35]-subject 课程中非常有用,以低廉的价格获得一致性。 -
使用来自 bipll 的代码 sn-p 您可以自己弄清楚。编写一个管理
int*的小类,并为其实现移动分配,而不检查自分配。它有多无错误? -
如果我们编写一个具有复制赋值运算符和移动赋值运算符的类。所以在一个(复制或移动)运算符中进行自分配检查就足够了。而不是同时签入(复制和移动)。
-
对于 stl,未指定自移动分配。请参阅此answer(由顶级 c++ 委员会成员和 libc++ 实施者撰写)
-
我的意见是像在 STL 中那样做。但是你可以断言:
assert(this!=&rhs)看看会发生什么。否则,您可以指定它具有默认语义,例如重置对象。
标签: c++ c++11 move-semantics move-assignment-operator