C++ 11:右值引用(rvalue references)
声明具名变量为引用,即既存对象或函数的别名。
- 左值引用声明符:声明 S& D; 是将 D 声明为 声明说明符序列 S 所确定的类型的左值引用。
- 右值引用声明符:声明 S&& D; 是将 D 声明为 声明说明符序列 S 所确定的类型的右值引用。
引用必须被初始化为指代一个有效的对象或函数:见引用初始化。
不存在 void 的引用,也不存在引用的引用。
引用不是对象;它们不必占用存储,尽管编译器会在需要实现所需语义(例如,引用类型的非静态数据成员通常会增加类的大小,量为存储内存地址所需)的情况下分配存储。
因为引用不是对象,所以不存在引用的数组,不存在指向引用的指针,不存在引用的引用:
1 | int& a[3]; // 错误 |
引用折叠
通过模板或 typedef 中的类型操作可以构成引用的引用,此时适用引用折叠(reference collapsing)规则:右值引用的右值引用折叠成右值引用,所有其他组合均折叠成左值引用:
1 | typedef int& lref; |
(这条规则,和将 T&& 用于函数模板时的模板实参推导的特殊规则一起,组成了使得 std::forward 可行的规则。)
左值引用
左值引用可用于建立既存对象的别名(可拥有不同的 cv 限定):
1 |
|
它们也能用于在函数调用中实现按引用传递语义:
1 |
|
当函数的返回值是左值引用时,函数调用表达式变成左值表达式:
1 |
|
右值引用
右值引用可用于为临时对象延长生存期(注意,到 const 的左值引用也能延长临时对象生存期,但这些对象无法因此被修改):
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Vinda's Blog!
评论