使用 LValue 引用移动语义

Move semantics with LValue reference

本文关键字:语义 移动 引用 LValue 使用      更新时间:2023-10-16

所以Move语义很棒,为我们提供了更高的性能。

我读到这是一个全新的功能,没有 C++11,就"不可能"做到这一点。

但是我们可以在C++11之前做到这一点吗?就像下面这样的东西。

class AAA
{
private:
    int* m_data;
public:
    AAA(int _data) : m_data(new int(_data)) { }
    AAA(AAA& _other) // Not using RValue reference.
    {
        m_data = _other.m_data;
        _other.m_data = nullptr;
    }
    ~AAA() { delete m_data; }
};
int main()
{
    AAA sth1(100);
    AAA sth2(sth1)
    return 0;
}

我认为 RValue 引用的存在是为了不使参数略有不同的相同函数(如 Const 和 Non-Const)。

简单地说,使用RValue引用,这只是另一种"类型",我们可以同时执行复制构造函数和移动构造函数。仅此而已。

想知道我是否正确或错过了一些巨大的东西。

提前谢谢。

std::auto_ptr完全按照你的建议做了。 问题在于它使行为变得混乱和复制不可能。 右值引用允许创建既可以移动又可以复制的类。

右值引用允许基于上下文自动移动/复制(例如临时的移动),尝试使用左值样式复制构造函数(实际执行移动)模拟这一点可能是灾难性的。

我的理解是,移动语义不仅是可能的,而且可以作为C++03编译器的库(Boost.Move)(可能有一些限制)。但是,语言实现可能是必要的,既可以在不接触任何代码的情况下进行自由优化,也可以尽可能简化其使用。

是的,缺少一些东西,即使它们是非常量,你也不会得到左值。 非常量左值不能从临时生成,因此在这种情况下您的尝试不起作用。

如果你想把右值传递给你的构造函数怎么办?您的 ctor 将失败,因为它是非恒量。 使用右值引用,您可以将右值传递给 ctor,并从中移动,因为右值始终是临时的。