在几个地方,我看到推荐的复制和移动构造函数签名如下:
struct T
{
T();
T(const T& other);
T(T&& other);
};
复制构造函数采用 const 引用,而移动构造函数采用非 const 右值引用。
但据我所见,这阻止了我在从函数返回 const 对象时利用移动语义,例如以下情况:
T generate_t()
{
const T t;
return t;
}
使用 VC11 Beta 进行测试,T
调用的是复制构造函数,而不是移动构造函数。即使使用return std::move(t);
复制构造函数仍然被调用。
我可以看到这是有道理的,因为t
const 所以不应该绑定到T&&
. 在移动构造函数签名中使用const T&&
效果很好,并且很有意义,但是您会遇到问题,因为other
是 const,如果需要将其成员清空,则不能将其清空 - 只有当所有成员都是标量时,它才会起作用或具有正确签名的移动构造函数。
它看起来是确保在一般情况下调用移动构造t
函数以首先制作非常量的唯一方法,但我不喜欢这样做 - 构造事物是一种很好的形式,我不希望客户T
知道他们必须反对这种形式才能提高性能。
所以,我想我的问题是双重的;首先,移动构造函数应该采用 const 还是非 const 右值引用?第二:我的推理是否正确?我应该停止返回 const 的东西吗?