引用折叠和右值引用参数

通常我们不能将一个右值引用绑定到一个左值上。但是,C++语言在正常的绑定规则之外定义了两个例外规则:
第一个例外规则影响右值引用参数的推断如何进行。当我们将一个左值传递给函数的右值引用参数,且此右值引用指向模板类型参数(如T&&)时,编译器推断模板类型参数为实参的左值引用类型。
第二个例外绑定规则:如果我们间接创建一个引用的引用,则这些引用形成了“折叠”。在所有情况下(除了一个例外),引用会折叠成一个普通的左值类型。在新标准中,折叠规则扩展到右值引用。只在一种特殊情况下引用会折叠成右值引用:右值引用的右值引用。即对于一个给定类型X:
1。X& &、X& &&和X&& &都折叠成类型X&。
2。类型X&& &&折叠成X&&。
这两个规则导致了两个重要结果:
1。如果一个函数参数是一个指向模板类型参数的右值引用(如T&&),则它可以被绑定到一个左值;且
2。如果实参是一个左值,则推断出的模板实参类型将是一个左值引用,且函数参数将被实例化为一个(普通)左值引用参数(T&)。
另外值得注意的是,这两个规则暗示我们:可以将任意类型的实参传递给T&&类型的函数参数。

在实际中,右值引用通常用于两种情况:模板转发其实参或模板被重载。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值