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

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是左值还是右值,都会转换为右值引用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值