我正在阅读有关std::move http://en.cppreference.com/w/cpp/utility/move,移动构造函数和移动赋值运算符。
说实话,我现在得到的只是困惑。现在我有一堂课:
class A{
public:
int key;
int value;
A(){key = 3; value = 4;}
//Simple move constructor
A(A&& B){ A.key = std::move(B.key);
A.value = std::move(B.value);}
};
- 我想
B
是一个右值引用,为什么你可以申请std::move
到右值引用成员?
- After
B.key
and B.value
都被移动了,都失效了,但是怎么办B
作为类的对象A
失效?
- 如果我有怎么办
A a(A())
, A()
显然是一个rvlaue,可以A()
被感动std::move
为什么?
-
同样,如果我有一个函数
int add(int && z){
int x = std:move(z);
int y = std:move(z);
return x+y;
}
如果我打电话怎么办add(5)
, 怎么能5
被感动,为什么?
并注意z
已移动两次,之后z
第一次移动已经失效,怎么才能再次移动呢?
- 定义时
foo (T && Z )
(T
, Z
可以是任何东西),在定义的主体中为什么我应该使用std::move(Z)
since Z
已经通过右值引用传递,我什么时候应该使用std::move
?
std::move
不移动任何东西,但将其参数“标记”为右值引用。从技术上讲,它将类型转换为右值引用。然后,右值引用将由相应的移动构造函数或移动赋值运算符移动。对于仅包含具有简单移动向量/赋值运算符的成员的对象,移动向量/赋值运算符是简单的并且只是复制。一般来说,对象的移动向量/赋值运算符调用其所有成员的移动向量/赋值运算符。
所以,每当你写
int x = 10;
int y = std::move(x);
在作业的右侧y = std::move(x)
,你有一个类型的右值引用int&&
。然而,int
没有不平凡的移动向量,并且右值被简单地复制到y
,没有任何改变x
.
另一方面,
string s = "some string";
string moved_s = std::move(s); // here we tell the compiler that we can "steal" the resource of s
是不同的。的移动构造函数moved_s
启动并“窃取”(即交换内部指针等)资源s
,因为后者是右值引用。在最后,s
不会包含任何元素。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)