【发布时间】:2015-02-14 08:42:21
【问题描述】:
我正在阅读有关std::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应用于一个ravlue 引用的成员? -
B.key和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),因为Z已经通过右值引用传递,什么时候应该我用std::move?
【问题讨论】:
标签: c++ c++11 move rvalue-reference