C++:右值参考存储器

Har*_*rma 8 c++ c++11

由于c ++提供了对rvalues的引用,即rvalue引用,它们主要用于执行移动语义和其他内存有效的任务.但是在下面的例子中,引用是改变文字的值,但是我们知道文字是只读的,所以引用如何改变某些只读变量的值.右值引用是否分配了它自己的内存,或者它只是改变了文字的值?

#include <iostream>
using namespace std;

int main()
{
    int a = 5;
    int&& b = 3;
    int& c = a;
    b++;
    c++;
    cout << " Value for b " << b << " Value for c " << c << endl;
}
Run Code Online (Sandbox Code Playgroud)

其次,当为临时对象分配引用时,引用将使用该对象的数据.但是根据临时对象的定义,它们会在使用它们的表达式结束时被删除.如果该临时对象内存不足,该引用如何作为该临时对象的别名?

Die*_*ühl 12

数字文字不能绑定到任何引用,既不是右值引用也不是左值引用.从概念上讲,数字文字创建一个从文字值初始化的临时对象,这个临时对象可以绑定到右值引用或const左值引用(int const& r = 17;).文字的相关引用似乎是5.1.1 [expr.prim.general]第1段:

文字是主要表达方式.它的类型取决于它的形式(2.14).字符串文字是左值; 所有其他文字都是prvalues.

将引用直接绑定到临时引用时,它的生命周期会延长,直到引用超出范围.终身问题的相关部分是12.2 [class.temporary]第5段:

第二个上下文是引用绑定到临时的.绑定引用的临时对象或绑定引用的子对象的完整对象的临时对象在引用的生命周期内持续存在,除了:

  • 绑定到构造函数的ctor-initializer(12.6.2)中的引用成员的临时绑定将持续存在,直到构造函数退出.
  • 函数调用(5.2.2)中的引用参数的临时绑定将持续到包含该调用的完整表达式完成为止.
  • 函数返回语句(6.6.3)中返回值临时绑定的生命周期未扩展; 临时在return语句中的full-expression结束时被销毁.
  • 在new-initializer(5.3.4)中对引用的临时绑定将持续到包含new-initializer的full-expression完成为止.