C++ 右值引用初始化和赋值

C++ 11添加了一种称为右值引用的新类型引用。右值引用是一个只能用右值初始化的引用。使用单个&符号创建左值引用,但使用双&符号创建右值引用:

int x = 5;int &lref = x; // 使用左值x初始化左值引用
​​​​​​​int &&rref = 5; // 使用右值5初始化右值引用

无法使用左值初始化右值引用。

右值引用有两个有用的属性。首先,右值引用将它们初始化的对象的生命周期延长到右值引用的生命周期(对const对象的左值引用也可以这样做)。其次,非常量右值引用允许您修改右值!我们来看看一些例子:

#include <iostream> 

class Fraction{
private:	
    int m_numerator;	
    int m_denominator; 
public:	
    Fraction(int numerator = 0, int denominator = 1) :		m_numerator(numerator),m_denominator(denominator)	{	} 

	
friend std::ostream& operator<<(std::ostream& out, const Fraction &f1)	
{		
    out << f1.m_numerator << "/" << f1.m_denominator;		
    return out;	
}}; 

int main()
{	
    Fraction &&rref = Fraction(3, 5); 

    // r-value reference to temporary Fraction	
    std::cout << rref << '\n'; 	
    return 0;

} // rref (and the temporary Fraction) goes out of scope here


该程序输出:

3/5

作为一个匿名对象,Fraction(3,5)通常会在定义它的表达式的末尾超出范围。但是,由于我们用它初始化一个右值引用,它的持续时间会延长到块的结尾。然后我们可以使用该右值引用来输出Fraction的值。现在让我们来看一个不太直观的例子:

#include <iostream>
 
int main()
{    
    int &&rref = 5; 
    // because we're initializing an r-value reference with a literal, a temporary with value 5 is created here    
    rref = 10;    
    std::cout << rref;     return 0;
}
该程序输出:

10

虽然使用数字值初始化右值引用然后能够更改该值可能看起来很奇怪,但是当使用数字初始化右值时,从整数构造临时值以使引用引用临时值对象,而不是数字值。右值引用不经常以上述任何一种方式使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值