0
作为参考,我指的是正常参考 - 在“按参考调用”函数中使用的参考。这个引用和左值引用有区别吗?引用和左值引用是否有区别?
作为参考,我指的是正常参考 - 在“按参考调用”函数中使用的参考。这个引用和左值引用有区别吗?引用和左值引用是否有区别?
在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因为一些匿名downvoter downvoted。顺便说一句,我曾经做过一个相当漂亮的版本。它在一些SO回答某处。 – 2014-09-06 13:58:00
由于OP添加了[visual-C++]标记,因此可能需要添加一个语言扩展,它可以将类型rvalues绑定到非常量左值引用。 – dyp 2014-09-06 14:00:01
@dyp:好点,完成。 – 2014-09-06 14:02:31