尽管我提供了移动构造函数,但仍调用了复制构造函数

Copy constructor is called although I have provided the move constructor

我已经实现了复制构造函数和移动构造函数,我了解到程序必须使用移动构造函数而不是复制构造函数。

class Move
{
private:
    int *data; // raw  pointer

public:
    Move(int);                // constructor
    Move(const Move &source); // copy constructor
    Move(Move &&source);      // Move Constructor
    ~Move();
};

Move::Move(int d)
{
    data = new int;
    *data = d;
    cout << "Constructor for: " << d << endl;
}

Move::Move(const Move &source)
    : Move(*source.data)
{
    cout << "Copy constructor -deep copy for: " << *data << endl;
}

Move::Move(Move &&source)
    : data{source.data}
{
    source.data = nullptr;
    cout << "Move constructor -Moving resource: " << *data << endl;
}

Move::~Move()
{
    if (data != nullptr)
    {
        cout << "Destructor freeing data for : " << *data << endl;
    }
    else
    {
        cout << "Destructor freeing data for nullptr" << endl;
    }
    delete data;
}

//driving function
int main()
{

    vector<Move> vec;
    vec.push_back(Move{10});
    vec.push_back(Move{20});
    vec.push_back(Move{30});
    vec.push_back(Move{40});
    vec.push_back(Move{50});
    vec.push_back(Move{60});
    vec.push_back(Move{70});

    return 0;
}

输出:

构造函数:10

移动构造函数-移动资源:10

析构函数为 nullptr 释放数据

构造函数:20

移动构造函数-移动资源:20

构造函数:10

复制构造函数-深度复制:10

析构函数释放数据:10

析构函数为 nullptr 释放数据

构造函数:30

移动构造函数-移动资源:30

构造函数:10

复制构造函数-深度复制:10

构造函数:20

复制构造函数-深度复制:20

析构函数释放数据:10

析构函数释放数据:20

析构函数为 nullptr 释放数据

构造函数:40

移动构造函数-移动资源:40

析构函数为 nullptr 释放数据

构造函数:50

移动构造函数-移动资源:50

构造函数:10

复制构造函数-深度复制:10

构造函数:20

复制构造函数-深度复制:20

构造函数:30

复制构造函数-深度复制:30

构造函数:40

复制构造函数-深度复制:40

析构函数释放数据:10

析构函数释放数据:20

析构函数释放数据:30

析构函数释放数据:40

析构函数为 nullptr 释放数据

构造函数:60

移动构造函数-移动资源:60

析构函数为 nullptr 释放数据

构造函数:70

移动构造函数-移动资源:70

析构函数为 nullptr 释放数据

析构函数释放数据:10

析构函数释放数据:20

析构函数释放数据:30

析构函数释放数据:40

析构函数释放数据:50

析构函数释放数据:60

释放数据的析构函数:70

因为 std::vector 仅当您有 noexcept 移动构造函数时才在调整大小时移动。 或者您可以调用 vec.reserve(7) 以避免调整大小。