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

Seb*_*mer 3 move c++11

我写了下面发布的代码.我希望能够在实例之间移动向量的内容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;
}
Run Code Online (Sandbox Code Playgroud)

可能的输出:

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
Run Code Online (Sandbox Code Playgroud)

P0W*_*P0W 6

右值引用在其const表单中没有意义,因为您想要修改它们(您想要"移动"它们).const在C++中创建的对象位于只读内存中,从中可以捕获/修改内部资源.

移动构造函数的语法通常应该是

  • class_name ( class_name && )

所以使用:

LargeClass ( LargeClass&& rhs )