通过引用,我指的是普通引用——在“引用调用”函数中使用的引用。这个引用和左值引用有区别吗?
最佳答案
C++中有两种引用:左值引用和右值引用。两者都是引用。绑定(bind)到任何一种引用的函数参数都是“按引用传递”。
左值引用绑定(bind)到左值,常量左值引用也绑定(bind)到右值。*
右值引用仅绑定(bind)到右值,从不绑定(bind)到左值。
分离这两种引用的效用在于右值引用可以假设所引用的值没有别名(因为它要么是纯右值(即临时的),要么是故意声明的 xvalue即将到期),因此可以在没有任何人注意的情况下进行修改。
这允许移动资源和转移所有权的概念,当引入右值引用时,这在 C++11 之前的类型系统中无法正确表达。在此之前,只有一种引用,即左值引用。
*) Microsoft 编译器还允许将非常量左值引用绑定(bind)到右值。这是不标准的,令人惊讶和困惑。
提醒一下,C++ 中值类别的分类是这样的:
value
/ \
glvalue rvalue
/ \ / \
lvalue xvalue prvalue
T & f() T && f() T f()
下面是一个示例:函数调用表达式 f()
的值类别如所指示的那样,前提是 f
具有各自声明的返回类型(和 T
不是引用类型)。此外,函数的返回类型可以恢复为decltype(f())
。
关于c++ - 引用和左值引用之间有什么区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25700981/