移动构造函数应该采用 const 或非 const 右值引用吗?

2023-12-21

在几个地方,我看到了复制和移动构造函数的推荐签名,如下所示:

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(使用前将#替换为@)

移动构造函数应该采用 const 或非 const 右值引用吗? 的相关文章

随机推荐