繁体   English   中英

移动构造函数没有被调用

[英]Move Constructor is not getting called

我编写了以下代码来演示移动构造。 但是,即使我使用过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引用的函数,但是未打印move构造函数语句,它实际上已被调用,或者正在调用其他成员函数。 请在这里看到问题。

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

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

请记住, std::move只是对右值引用强制转换

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

在上面的行中,将xyd2point&&d2point&& -它们绑定到p1p2 尚未施工。 最后,将add_point调用的结果存储到z 由于返回值的优化 ,极有可能您也不会在其中看到移动构造函数。


add_point更改为

d2point add_point(d2point p1, d2point p2) 

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM