3

所以 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 引用只是另一种“类型”,我们可以同时执行 Copy 构造函数和 Move 构造函数。就是这样。

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

提前致谢。

4

4 回答 4

3

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

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

于 2012-05-10T14:37:42.807 回答
3

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

于 2012-05-10T14:38:28.493 回答
0

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

于 2012-05-10T14:37:07.000 回答
0

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

于 2012-05-10T14:38:24.457 回答