繁体   English   中英

使用LValue引用移动语义

[英]Move semantics with LValue reference

所以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正是你的建议。 问题是它使行为混乱和复制变得不可能。 Rvalue引用允许创建可以移动和复制的类。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM