使用LValue引用移动语义

时间:2012-05-10 14:33:51

标签: c++ c++11

所以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引用只是另一个'类型',我们可以同时执行复制构造函数和移动构造函数。就是这样。

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

提前致谢。

4 个答案:

答案 0 :(得分:3)

std::auto_ptr完全按照您的建议行事。问题是它使行为混乱和复制变得不可能。 Rvalue引用允许创建可以移动和复制的类。

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

答案 1 :(得分:3)

我的理解是移动语义不仅可行,而且可用作C ++ 03编译器的库(Boost.Move(可能有一些限制)。但是,语言实现可能必须允许自由优化而不触及任何代码并尽可能简化它的使用。

答案 2 :(得分:0)

是的,有些东西缺失了,即使它们不是常量,你也不会使用左值。非常数值不能从临时产生,因此在这种情况下你的尝试不起作用。

答案 3 :(得分:0)

如果要将rvalue传递给构造函数,该怎么办?你的ctor会失败,因为它是非常量的。使用右值引用,您可以将右值传递给ctor,然后从它移动,因为rvalues总是临时的。