右值引用背后的移动语意和完美传递

http://thbecker.net/articles/rvalue_references/section_01.html

这篇文章将问题的原因和解决方法叙述的很详细,有空翻译一下


note:

1. 有名字的会被认为是左值 If it has a name, then it's an lvalue

比如void foo(X&& x)

{

X z = x; // 这里x被认为是左值,这里调用的是X的左值引用拷贝构造函数也就是(X&)

}

这样处理的原因是有名字的,在接下来的代码段中可以被使用,那么如果用了移动语意,就很容易混乱导致出错


2. 

X foo()
{
  X x;
  // perhaps do something to x
  return std::move(x); // making it worse!
}
原因:现代编译器会做返回值优化,x会被直接构建在返回区域。而不是构建一个x,然后拷贝x到返回区域。所以如果使用move,反而更慢了。
 
 
3. std::forward
解决的是参数传递过程左右值的问题。它保证如果传递的是左值,那么返回的是左值引用;如果是右值,那么返回的是右值引用。实现的原理依赖2点:一个是&&折叠,一个是模板参数推导
 
 
4. std::move(x)
无论x是左值还是右值,都会转换为右值引用

你可能感兴趣的:(右值引用背后的移动语意和完美传递)