右值rvalues是怎么产生的?
想必你知道,当对象没有命名时,它就是一个右值。一般来说,右值是一个临时的对象,作为函数调用的返回或者其他操作的结果,存在于栈中:
- 从一个函数调用的返回值会转变成一个右值。也就是说,一旦你调用返回一个对象,但这个对象的命名又从来没有存在过,它就变成了右值。
- 同样的,调用一个函数会返回一个右值。返回的值没有命名。
Move构造函数与右值一起使用
Move构造函数与拷贝构造函数类似。他们从另一个对象构造了一个相同类型的对象。构造函数的参数类型也因此改变,为了之让他接受右值。
下面这是一个拥有move构造函数的示例。它会使得编译器不会生成一个隐式的拷贝构造函数,使得这个类只能move构造。
move构造函数的参数是一个MyType&&,这是一个引用,就像MyType&,除了它只能绑定一个右值。这也意味着如下的代码不会编译成功,因为,它试图不通过右值来构建一个新的MyType。
note: ‘constexpr MyType::MyType(const MyType&)’ is implicitly declared as deleted because ‘MyType’ declares a move constructor or move assignment operator
move构造函数做了浅拷贝
move构造函数,就像拷贝函数一样,是将其他对象中的成员拷贝到自