C ++中Reference的参考

时间:2011-04-08 05:52:05

标签: c++

我每隔一段时间就会在StackOverflow上看到代码,询问一些涉及像以下函数的过载模糊:

void foo(int&& param);

我的问题是:为什么会出现这种情况?或者更确切地说,你何时会“引用参考”?这与普通的旧参考有什么不同?我从来没有在现实世界的代码中遇到过这个问题,所以我很想知道需要什么样的代码。

3 个答案:

答案 0 :(得分:45)

这是一个右值参考,Bjarne描述了它here

无耻复制(“引用”):

  

右值参考

     

右值参考是复合类型   非常类似于C ++的传统   参考。为了更好地区分这些   两种类型,我们指的是传统的   C ++引用作为左值引用。   当使用术语参考时,它   指两种参考:   左值参考和右值参考。

     

由左右形成左值参考   放置一个&在某种类型之后。

A a; A& a_ref1 = a;  // an lvalue reference
     

形成右值参考   放置&&经过某种类型。

A a; A&& a_ref2 = a;  // an rvalue reference
     

右值引用的行为就像   左值参考,但它可以   绑定到临时(右值),   而你不能绑定(非常)   左值对右值的引用。

A&  a_ref3 = A();  // Error! 
A&& a_ref4 = A();  // Ok

答案 1 :(得分:13)

它不是对引用的引用:这样的东西不存在。

这是一个rvalue reference,在即将标准化的C ++ 11中添加了一项新功能。

答案 2 :(得分:8)

这是一个右值参考。请注意,用于布尔AND和右值引用的&&标记以及用于按位AND和普通引用的&标记,就语言而言是不同的“单词”。

rvalue引用(通常)绑定到一个对象,该对象在rvalue引用完成后可能处于不确定状态,可能是因为该对象将被销毁。

简单地说,将变量绑定到右值引用通常是你做的最后一件事。

与常规引用不同,但与const &引用不同,rvalue引用可以绑定到rvalue(不能直接获取地址的表达式)。像常规引用一样,但与const &引用不同,可以使用右值引用来修改其对象。