我每隔一段时间就会在StackOverflow上看到代码,询问一些涉及像以下函数的过载模糊:
void foo(int&& param);
我的问题是:为什么会出现这种情况?或者更确切地说,你何时会“引用参考”?这与普通的旧参考有什么不同?我从来没有在现实世界的代码中遇到过这个问题,所以我很想知道需要什么样的代码。
答案 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 &
引用不同,可以使用右值引用来修改其对象。