在几个地方,我看到了复制和移动构造函数的推荐签名,如下所示:
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&&
. Using const T&&
在移动构造函数签名中工作正常,并且有意义,但是你会遇到一个问题,因为other
是 const,如果需要将其成员清空,则不能将其成员清空 - 仅当所有成员都是标量或具有具有正确签名的移动构造函数时,它才有效。
它看起来是确保在一般情况下调用移动构造函数的唯一方法t
首先是非常量,但我不喜欢这样做 - 常量是很好的形式,我不希望客户这样做T
要知道他们必须违背这种形式才能提高绩效。
所以,我想我的问题是双重的;首先,移动构造函数应该采用 const 还是非 const 右值引用?第二:我的推理正确吗?我应该停止返回 const 的东西吗?
它应该是一个非const
右值参考。
如果一个对象被放置在只读内存中,您就无法从中窃取资源,即使它的正式生命周期即将结束。创建的对象为const
在 C++ 中允许存在于只读内存中(使用const_cast
尝试改变它们会导致未定义的行为)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)