在C ++中引用参考
我每隔一段时间就看到StackOverflow上的代码,询问一些涉及如下函数的过度含糊:
void foo(int&& param);
我的问题是:为什么这甚至出现? 或者说,你什么时候会“参考一个参考”? 这与普通的老参考有什么不同? 我从来没有在现实世界的代码中遇到这个问题,所以我很好奇哪种types的代码需要这个。
这是一个右值参考,Bjarne 在这里描述。
无耻复制(“引用”):
右值引用
右值引用是一个非常类似于C ++传统引用的复合types。 为了更好地区分这两种types,我们将传统的C ++引用作为左值引用。 当使用术语引用时,它指的是两种引用:左值引用和右值引用。
一个左值引用是通过放置一个&后一些types。
A a; A& a_ref1 = a; // an lvalue reference
右值引用是通过在某种types之后放置&&而形成的。
A a; A&& a_ref2 = a; // an rvalue reference
一个右值引用的行为就像一个左值引用,只不过它可以绑定到一个临时值(右值),而不能将一个(非常量)左值引用绑定到右值。
A& a_ref3 = A(); // Error! A&& a_ref4 = A(); // Ok
这不是一个参考的参考 :这样的事情不存在。
这是一个右值引用 ,在即将被标准化的C ++ 11中增加了一个新特性。
这是一个右值引用。 请注意,用于布尔AND和右值引用的&&
标记,以及用于按位AND和正常引用的&
标记,只要语言可以识别,就是不同的“字”。
右值引用(通常)绑定到一个对象,在右值引用完成之后,该对象可能会处于不确定状态,这大概是因为该对象将被销毁。
简单地说,将一个variables绑定到右值引用通常是最后一件事情。
与常规引用不同,但像const &
引用一样,右值引用可以绑定到右值(不能直接获取地址的expression式)。 像常规引用一样,但不像const &
reference,可以使用右值引用来修改其对象。