移动构造函数未被调用

问题描述 投票:2回答:1

我编写了以下代码来演示移动构造。但即使我使用了std :: move(),也没有调用move构造函数。有人可以看看这里有什么问题。

#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;
}

以下是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;}
};

该计划的产出如下:

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

这里调用了接受rvalue引用的函数,但是没有打印移动构造函数语句,它实际上被调用或者正在调用其他一些成员函数。请在这里看到问题。

c++ c++11 constructor move-constructor
1个回答
4
投票

除非您从d2point构造d2point&&的新实例,否则不会调用移动构造函数。在你的add_point函数中,你正在对d2point进行右值引用:这意味着你没有构造任何新的实例,只是引用现有的实例:

d2point add_point(d2point&& p1, d2point&& p2) 
//                       ^^            ^^

请记住,std::move只是对右值参考的强制转换。

d2point z = add_point(move(x), move(y));

在上面的行中,你将xy都投射到d2point&& - 他们被绑定到p1p2。还没有施工。最后,将add_point调用的结果存储到z中。由于返回值优化,您很可能也看不到在那里调用的移动构造函数。


add_point改为

d2point add_point(d2point p1, d2point p2) 

肯定会引用d2point::d2point(d2point&&)

© www.soinside.com 2019 - 2024. All rights reserved.