c++ - 引用和左值引用之间有什么区别吗?

标签 c++ visual-c++

通过引用,我指的是普通引用——在“引用调用”函数中使用的引用。这个引用和左值引用有区别吗?

最佳答案

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/

相关文章:

C++ cout 一个数学函数

c++ - 在 vector 上调用 .end() 的复杂性是多少?

c++ - 当对象绑定(bind)到成员函数时,为什么 std::function 会调用析构函数?

c++ - 未获得 N-Queens 问题的预期输出

c - WinCE 应用程序的 Hello World(C 和 C++)- Visual Studio 2008

c++ - 将 __declspec(selectany) 与静态数据一起使用是否对该数据的初始化顺序有任何影响?

c++ - 如何在我的 vc++ 代码中包含 CTime

c++ - C 字符串函数的包装器类有问题吗?

c++ - 根据程序员的哲学,我想知道在哪里声明变量

visual-studio - VC++ Visual Studio 在子目录中添加了 .hpp 文件,但得到 "Error: cannot open source file ..."