use*_*112 11 c++ move move-semantics c++11
刚读完Stroustrup的C++编程语言第4版,他在第7章中说:
move(x)表示static_cast<X&&>(x)X是x的类型
和
由于move(x)不移动x(它只是产生对x的rvalue引用),如果move()被称为rval()则会更好
我的问题是,如果move()只是将变量转换为rval,那么实现对变量的引用"移动"的实际机制是什么(通过更新指针)?
我认为move()就像一个移动构造函数,除了客户端可以使用move()来强制编译器?
什么是实现对变量的引用"移动"的实际机制(通过更新指针)?
将其传递给采用右值引用的函数(或构造函数),并从该引用移动值.如果没有强制转换,变量就无法绑定到右值引用,因此无法传递给这样的函数 - 这可以防止变量意外移动.
我认为
move()就像一个移动构造函数,除了客户端可以move()用来强制编译器??
没有; 它用于将左值转换为右值,以便将其传递给需要右值引用的移动构造函数(或其他移动函数).
typedef std::unique_ptr<int> noncopyable; // Example of a noncopyable type
noncopyable x;
noncopyable y(x); // Error: no copy constructor, and can't implicitly move from x
noncopyable z(std::move(x)); // OK: convert to rvalue, then use move constructor
Run Code Online (Sandbox Code Playgroud)
当您打电话时move,您只是在告诉“嘿,我想移动这个对象”。并且当构造函数接受rvalue-reference时,它将其理解为“嗯,有人要我将数据从该对象移入我自己。所以,好的,我来做”。
std::move不会移动或更改对象,它只是将其“标记”为“可移动”。并且只有接受右值引用的函数才能实现移动实际对象。
这是一个示例,描述了上面的文本:
#include <iostream>
#include <utility>
class Foo
{
public:
Foo(std::size_t n): _array(new int[n])
{
}
Foo(Foo&& foo): _array(foo._array)
{
// Hmm, someone tells, that this object is no longer needed
// I will move it into myself
foo._array = nullptr;
}
~Foo()
{
delete[] _array;
}
private:
int* _array;
};
int main()
{
Foo f1(5);
// Hey, constructor, I want you move this object, please
Foo f2(std::move(f1));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1248 次 |
| 最近记录: |