假设你有这个简单的类:
class GenericClass {
public:
GenericClass(std::unique_ptr<uint8_t[]>& lref) {
this->var = std::move(lref);
}
private:
std::unique_ptr<uint8_t[]> var;
}
ctor如何处理“移动”?参考指向的左值的所有权是转移到成员变量还是参考另一个左值?
那么,通过一个例子可以很容易地理解std::move
的效果:
std::unique_ptr<uint8_t[]> data = ... ;
assert(data != nullptr); //data is not nullptr
GenericClass obj(data); //the resource is transferred
assert(data == nullptr); //data must be nullptr
希望这些评论可以解释到底发生了什么。
然而,没有评论,资源从data
转移到obj
并不是很清楚,因为构造函数的设计不够好。所以我建议明确说明:
GenericClass(std::unique_ptr<uint8_t[]>&& lref) //note &&
: var(std::move(lref)) //use mem-initialize-list
{
}
现在客户端应该写这个:
GenericClass obj(std::move(data));
现在即使没有评论,客户端代码也是可以理解的。