假设我有一个(平凡的)类,它是可移动构造和可移动分配的,但不能复制构造或复制分配:
class movable
{
public:
explicit movable(int) {}
movable(movable&&) {}
movable& operator=(movable&&) { return *this; }
movable(const movable&) = delete;
movable& operator=(const movable&) = delete;
};
这工作正常:
movable m1(movable(17));
当然,这不起作用,因为m1
它不是右值:
movable m2(m1);
但是,我可以换m1
行std::move
,将其转换为右值引用,以使其工作:
movable m2(std::move(m1));
到现在为止还挺好。现在,假设我有一个(同样微不足道的)容器类,它包含一个值:
template <typename T>
class container
{
public:
explicit container(T&& value) : value_(value) {}
private:
T value_;
};
但是,这不起作用:
container<movable> c(movable(17));
编译器(我尝试过 clang 4.0 和 g++ 4.7.2)抱怨我试图在' 的初始化列表中使用movable
' 已删除的复制构造函数。container
再次,包装value
使它std::move
工作:
explicit container(T&& value) : value_(std::move(value)) {}
但为什么std::move
在这种情况下需要?不是value
已经类型了movable&&
吗?有什么value_(value)
不同movable m1(movable(42))
?