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