2014-09-06 51 views

回答

3

在C++中有两种引用:左值引用和右值引用。两者都是参考。绑定到任何一种引用的函数参数是“通过引用传递”。

左值引用绑定到左值,和const左值引用也结合到右值。*

右值引用结合右值和永不左值。

分离这两种引用的效用在于,右值引用可以假设被引用的值不是别名(因为它是一个纯粹的右值(即临时)或者是一个x值故意地宣布为eXpiring),因此可以在没有人注意的情况下进行修改。

这使得移动资源和转移所有权,这不能被前C++ 11,当引入右值引用正确表达的类型系统的概念。在此之前,只有一种参考,左值参考。


*)Microsoft编译器还允许将非常量左值引用绑定到右值。这是非标准的,令人惊讶和困惑。


作为提醒,在C值类别++分类法是这样的:

   value 
      / \ 
     glvalue  rvalue 
     / \ / \ 
    lvalue  xvalue  prvalue 

    T & f()  T && f() T f() 

下边是一个例子:函数调用表达式的值类别f()被指示提供f具有各自声明的退货类型(并且T不是参考类型)。此外,函数的返回类型可以恢复为decltype(f())

+1

+1因为一些匿名downvoter downvoted。顺便说一句,我曾经做过一个相当漂亮的版本。它在一些SO回答某处。 – 2014-09-06 13:58:00

+0

由于OP添加了[visual-C++]标记,因此可能需要添加一个语言扩展,它可以将类型rvalues绑定到非常量左值引用。 – dyp 2014-09-06 14:00:01

+0

@dyp:好点,完成。 – 2014-09-06 14:02:31

相关问题