【发布时间】:2018-06-01 21:38:17
【问题描述】:
我编写了以下代码来演示移动构造。但即使我使用了 std::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
这里正在调用正在调用右值引用的函数,但没有打印移动构造函数语句,它确实被调用或正在调用其他一些成员函数。请在这里查看问题。
【问题讨论】:
-
std::move是(大约)转换为右值引用。它本身实际上并没有做任何事情。 -
@Mat,如果将转换后的右值传递给函数,那么为什么调用移动构造函数将争论从 x 移动到 p1 和 y 到 p2。?
-
p1和p2是引用。如果您有add_point(d2point&, d2point&),您不会期望参数被复制,对吗?这里也一样。 -
您希望从“移动”int 值中获得什么?
-
@manni66,这只是为了演示。我得到了移动而不是复制的 git。谢谢。
标签: c++ c++11 constructor move-constructor