我认为答案是:自己实现这样的行为是非常微不足道的,因此标准没有必要对编译器本身施加任何规则。 C++语言是巨大的,在使用之前并不是所有的东西都可以想象。以C++的模板为例。它并非首先被设计用于今天使用的方式(即它是元编程功能)。所以我认为,标准只是给了自由,并没有对std::move(other.p)
做出任何具体规定,遵循其中一项设计原则:“你不支付你不使用的东西”。
虽然,std::unique_ptr
是可移动的,但不可复制。所以,如果你想指针的语义是可移动的,能够复制两个,那么这里是一个简单的实现:
template<typename T>
struct movable_ptr
{
T *pointer;
movable_ptr(T *ptr=0) : pointer(ptr) {}
movable_ptr<T>& operator=(T *ptr) { pointer = ptr; return *this; }
movable_ptr(movable_ptr<T> && other)
{
pointer = other.pointer;
other.pointer = 0;
}
movable_ptr<T>& operator=(movable_ptr<T> && other)
{
pointer = other.pointer;
other.pointer = 0;
return *this;
}
T* operator->() const { return pointer; }
T& operator*() const { return *pointer; }
movable_ptr(movable_ptr<T> const & other) = default;
movable_ptr<T> & operator=(movable_ptr<T> const & other) = default;
};
现在,你可以写的类,而不用自己写的举动语义:
struct T
{
movable_ptr<A> aptr;
movable_ptr<B> bptr;
//...
//and now you could simply say
T(T&&) = default;
T& operator=(T&&) = default;
};
注您仍然必须编写复制语义和析构函数,因为movable_ptr
是而不是智能指针。
为什么要这样?你应该对一个'移动'对象做的唯一事情就是忽略它。如果不再使用指针,指向不属于该类的内存的指针不应该成为问题,对吧? – hvd 2012-02-26 11:06:14
“你不支付你不使用的东西”? – 2012-02-26 11:09:15
@hvd:析构函数,如果它说'删除p' :) – fredoverflow 2012-02-26 11:10:40