I have written the following code to demonstrate the move construction. But even though I have used std::move(), move constructor is not being invoked. Can someone please see what is the problem here.
#include "point.hpp"
using namespace std;
class point;
d2point add_point(d2point&& p1, d2point&& p2)
{
cout << "inside add point function" << endl;
d2point z;
z.setX(p1.getX() + p2.getX());
z.setY(p1.getY() + p2.getY());
return z;
}
int main()
{
d2point x(2,3);
d2point y(2,3);
d2point z = add_point(move(x), move(y));
z.print_point();
x.print_point();
return 0;
}
The following is the code from point.hpp
using namespace std;
class point
{
private:
int x;
public:
point(){cout << "point default constructor gets called" << endl;}
point(int x){ cout << "point param constructor gets called" << endl;
this->x = x;
}
point(const point& p){
cout << "point copy constructor gets called" << endl;
this->x = p.x;
}
point(point&& other):x(std::move(other.x)) {
cout << "point move constructor gets called" << endl;
}
int getX(){return x;}
void setX(int x) { this->x = x; }
virtual void print_point() {}
virtual ~point(){cout << "point destructor gets called" << endl;}
};
class d2point: public point
{
private:
int y;
public:
d2point()
{
cout << "d2point default constructor gets called" << endl;
}
d2point(int x, int y):point(x) {
cout << "d2point parameterized constructor gets called" << endl;
this->y = y;
}
d2point(const d2point& rhs): point(rhs) {
cout << "d2point copy constructor gets called" << endl;
this->y = rhs.y;
}
d2point(d2point&& rhs):point(std::move(rhs)) {
cout << "d2point move constructor gets called" << endl;
this->y = std::move(rhs.y);
rhs.y = 0;
}
int getY(){return y;}
void setY(int y) { this->y = y; }
void print_point(){
cout << "(" << getX() << "," << y << ")" << endl;
}
~d2point(){ cout << "d2point destructor gets called" << endl;}
};
The output of the program is as follows:
point param constructor gets called
d2point parameterized constructor gets called
point param constructor gets called
d2point parameterized constructor gets called
inside add point function
point default constructor gets called
d2point default constructor gets called
(4,6)
(2,3)
d2point destructor gets called
point destructor gets called
d2point destructor gets called
point destructor gets called
d2point destructor gets called
point destructor gets called
Here the function which is taking the rvalue reference is being called, but the move constructor statement is not getting printed, it is really called or some other member function is being invoked. Kindly see the problem here.
std::moveis (approx) a cast to rvalue reference. It doesn't actually do anything itself.p1andp2are references. You wouldn't expect the arguments to be copied if you hadadd_point(d2point&, d2point&), would you? Same here.