c ++ 11为什么移动构造函数不起作用?

时间:2014-06-30 07:11:47

标签: c++11 move

我写了下面发布的代码。我希望能够在LargeClass的实例之间移动向量的内容。正在使用移动构造函数,但不是移动我只获得副本。

为什么移动语义不能像预期的那样工作?

代码:

#include <iostream>
#include <vector>

class LargeClass
{
public:
    explicit LargeClass (void): numbers(20, 10) 
    {
    }
    LargeClass (const LargeClass &rhs): numbers(rhs.numbers)
    { 
        std::cout << "Using LargeClass copy constructor" << '\n';
    }
    LargeClass (const LargeClass &&rhs): numbers(std::move(rhs.numbers))
    { 
        std::cout << "Using LargeClass move constructor" << '\n';
    }

    const int* getNumbersAddress(void) const
    {
        return (numbers.data());
    }

private:
    std::vector<int> numbers;
};

int main()
{
    LargeClass l1;
    std::cout << "l1 vector address: " << l1.getNumbersAddress() << '\n';

    LargeClass l2(l1);
    std::cout << "l1 vector address: " << l1.getNumbersAddress() << '\n';
    std::cout << "l2 vector address: " << l2.getNumbersAddress() << '\n';

    LargeClass l3 = std::move(l2); 
    std::cout << "l1 vector address: " << l1.getNumbersAddress() << '\n';
    std::cout << "l2 vector address: " << l2.getNumbersAddress() << '\n';
    std::cout << "l3 vector address: " << l3.getNumbersAddress() << '\n';

    return 0;
}

可能的输出:

l1 vector address: 0x18ce010
Using LargeClass copy constructor
l1 vector address: 0x18ce010
l2 vector address: 0x18ce070
Using LargeClass move constructor
l1 vector address: 0x18ce010
l2 vector address: 0x18ce070
l3 vector address: 0x18ce0d0

2 个答案:

答案 0 :(得分:6)

rvalue引用在const表单中没有意义,因为你想要修改它们(你想“移动”它们)。在C ++中创建为const的对象位于只读内存中,从中获取内部资源是不可能的。

移动构造函数normally的语法应为

  • class_name ( class_name && )

所以使用:

LargeClass ( LargeClass&& rhs )

答案 1 :(得分:3)

虽然采用const LargeClass&&的构造函数在技术上被称为移动构造函数(12.8 / 3)(令人困惑,但在[C++11: 12.8/3]中明确说明),但它很无用“无用”;不言而喻,你不能从const表达式移动,因为你无法修改const事物,移动意味着改变源代码!特别是,你不能实际const向量移动,这就是为什么在这里不会发生这种情况以及为什么你看到你所看到的。

更有用的移动构造函数如下所示:

LargeClass(LargeClass&& rhs)