假设我们有这个课程:
class Class
{
public:
Class(Class &&b)
{
a = b.a;
}
int *a;
}
int main()
{
Class object1(5);
Class object2(std::move(object1));
}
运行主功能的第二行之后,object1
会发生什么?如果将object1的内存“移动”到object2,则此副本构造函数的作用是什么?正因为我们要丢失对象1的内存而只是在内存中的不同位置获得完全相同的值?这是什么用例?
Edit
:问题不是重复的。从某种意义上说,甚至没有代码段,重复候选字的范围更广。]Edit2
:我刚刚尝试过这段代码:class trial
{
public:
trial()
{
a = (int*)malloc(4);
}
trial(trial& rv)
{
this->a = rv.a;
rv.a = NULL;
}
int *a;
};
int main() {
cout << "Program Started" << endl;
trial a1;
trial a2(a1);
return 0;
}
而且我已经检查了a1和a2的内部。用此代码可以得到完全相同的结果:
class trial { public: trial() { a = (int*)malloc(4); } trial(trial&& rv) { this->a = rv.a; rv.a = NULL; } int *a; }; int main() { cout << "Program Started" << endl; trial a1; trial a2(std::move(a1)); return 0; }
区别在于复制构造函数,其中之一不使用移动语义。只是对象的简单参考。如果我们也通过引用传递,则不会发生复制,但是通过执行rv.a = NULL
,我们将不得不丢失第一个对象,以避免通过释放a2
来意外释放a1
的内存。所以我设置了rv.a = NULL
。[当我使用类试用版的右值复制构造函数,但不使用右值构造函数中的行
rv.a = NULL
时,当我放个中断时,整数指针a
在a1
和a2
中都显示相同的地址指向return 0
行。那么,这与通过引用传递的方式有何不同?看起来我们可以通过引用传递完全相同。
[我试图理解std :: move和rvalues在C ++ 11中是如何工作的。在这样的教程中,我不断看到类似的示例:假设我们有这个类:class Class {public:Class(...
std::move
不会移动任何东西。它只是将对象强制转换(转换)为右值引用,这可以通过查看典型实现来看到:应用std :: move后对象实例会发生什么?“
std::vector
)。没有移动语义,它将被复制。有了它,移动基本上就是指针交换,它可以快得多。std::move
将使包括内存在内的资源所有权从对象1转移到对象2。因此,您的移动副本构造函数或移动分配运算符可以启动资源传输。因此,如果object1是可移动的,那么obj1的资源现在将是object2的资源。std::move
返回基于所提供对象的右值引用。现在可以将此新创建的右值引用传递给将右值引用作为参数的函数,例如void foo (Obj&& rvalue_reference)
。