C++中Reference的参考

Meh*_*dad 48 c++

我偶尔会在StackOverflow上看到代码,询问一些涉及函数的过载歧义:

void foo(int&& param);
Run Code Online (Sandbox Code Playgroud)

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

Sku*_*del 47

这是一个右值参考,Bjarne 在这里描述.

无耻复制("引用"):

右值参考

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

通过在某种类型之后放置&来形成左值引用.

A a; A& a_ref1 = a;  // an lvalue reference
Run Code Online (Sandbox Code Playgroud)

通过在某种类型之后放置&&来形成右值引用.

A a; A&& a_ref2 = a;  // an rvalue reference
Run Code Online (Sandbox Code Playgroud)

右值引用的行为与左值引用的行为类似,只是它可以绑定到临时值(右值),而不能将(非常量)左值引用绑定到右值.

A&  a_ref3 = A();  // Error! 
A&& a_ref4 = A();  // Ok
Run Code Online (Sandbox Code Playgroud)

  • 知道为什么有人会想要 - 更不用说需要使用它吗? (10认同)
  • 搜索“完美转发” (2认同)
  • 这条线 A a; A&& a_ref2 = a; 看起来不正确。a 是左值,左值不能绑定到 &&。上面这行应该表示为:A a; A&& a_ref2 = std::move(a); 或 A&& a_ref2 = A(); (2认同)

Jam*_*lis 13

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

它是一个右值引用,在即将标准化的C++ 11中添加了一个新功能.

  • 你能解释一下这个区别吗? (9认同)
  • 对引用的引用在 C++ 中确实存在,如果您稍微思考一下,您就会意识到它们必须存在。尽管只有编译器必须注释它们:用户甚至不允许在代码中编写此类内容(尽管如果他们这样做,则会写成带有空格的“&&”,而不是“&&”……或者确实如此) 、`& &&`、`&& &` 或其他类似的变体也可以)。 (2认同)

Pot*_*ter 8

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

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

简单地说,将变量绑定到右值引用通常是您最后做的事情.

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