表示c++11 添加了std::move后一直搞不清楚左值,右值神马的.下文只是个人理解(看了channel 9 上的视频后),不保证绝对正确哈!
1首先需要明确的一点
type&& -> rvalue reference 错误
千万不要天真的以为有了&&后,就是右值引用了!
type&& 可能代表两种情况
1> rvalue reference
2> universal reference
(universal refernce这一说法来自于scott mayer, 见名知意, universal.宇宙的...意思是可以接受任何类型)
universal reference可能会在四种情况下产生:
1>
template <typename T>
void f(T&& param)
2>
auto &&var = ...
3>
typedef declarations
4>
decltype expressions
根据scott mayer的定义:
if a variable or parameter has declared type T&& for some deduced type, its a universal reference.
(基本遵循这条规则你就阔以分辨出universal reference了)
好了,都是一些杂记,主要为了怕自己忘记
下面以视频最后的几条总结结尾
1.type&& != rvalue reference
2 not all T&&s in templates are universal references
这条很清晰了,还需要有type deduction
3.type&& + syntax + type deduction => universal references
4.whether universal reference becomes lref ot rref depends on intializer
即universal 到底表现为左值引用还是右值引用,主要依赖于其初始化的参数
5.overloading with urefs almost always wrong.
都是urefs了,再去重载本来就没什么多大意义
6.foundation is type deduction and reference collapsing.
我个人分辨左值右值主要遵循这个原则
lvalue reference to anything -> lvalue reference
rvalue reference to rvalue reference-> rvalue reference