在这种情况下为什么不调用我的move构造函数? (首先分配r值参考并创建对象)

时间:2019-03-01 11:45:02

标签: c++ c++11 move-semantics

(不确定我的帖子标题,对标题不佳表示歉意)。 我实现了以下代码:

#include <iostream>
#include <algorithm>

using namespace std;

class MyIntVector {
public:
    MyIntVector() {
        m_size = 10;
        m_mem = new int[m_size];
        for(auto i = 0; i < size(); ++i)
            m_mem[i] = 0;
    }
    MyIntVector(int size) {
        m_size = size;
        m_mem = new int[m_size];
    }
    MyIntVector(const MyIntVector& v) {
        m_mem = new int[v.size()];
        m_size = v.size();
        for(auto i = 0; i < v.size(); ++i)
            m_mem[i] = v[i];
    }
    MyIntVector(MyIntVector&& v) {
        cout << "Calling move constructor" << std::endl;
        m_size = v.size();
        m_mem = v.m_mem;
        v.m_mem = nullptr;
        delete [] v.m_mem;
    }
    int size() const {return m_size;}
    int& operator[](int i) { return m_mem[i];}
    int operator[](int i) const { return m_mem[i];}

    friend ostream& operator<<(ostream& os, const MyIntVector& v);

protected:
    int * getMemPtr() {return m_mem;}
private:
    int m_size;
    int *m_mem;
};

ostream &operator<<(ostream &os, const MyIntVector &v) {
    for (auto i = 0; i < v.size(); ++i)
        os << v[i] << " ";
    return os;
}

void linear_init(MyIntVector& v) {
    for(auto i = 0; i < v.size(); ++i)
        v[i] = i + 1;
}

int main(int argc, char** argv) {
    MyIntVector&& my_v_2 = MyIntVector(20); //binding R-value to R-value reference
    MyIntVector my_v_3(my_v_2);

    return 0;
}

具体来说,我正在初始化一个r值引用,后来我使用它来初始化另一个对象。但是我原以为会调用move构造函数,但会调用copy构造函数,有人能解释我为什么吗?

(这只是一些了解移动语义和r值引用的测试代码)。

更具体地说,我想在文档中有一个引用来解释为什么不调用move构造函数。

1 个答案:

答案 0 :(得分:4)

简单地说-所有具有名称的东西都是左值。因此,命名为rvalue的引用在您的情况下my_v_2是一个左值。并且在使用左值时,不会调用move构造函数。要使其正常工作,您必须将其移动:

MyIntVector my_v_3(std::move(my_v_2));