这段代码应该做什么?(参考右值)

jbg*_*bgs 0 c++ rvalue c++11

我已经读过下面的代码在C++ 11中有效:

int && a = 3;
a = 4;
Run Code Online (Sandbox Code Playgroud)

是否应该在存储数字文字3的内存地址中写入4?也许一些编译器优化可以防止这种情况发生,但它应该这样做吗?

Jos*_*eld 7

将非类型的prvalue分配给rvalue引用时,会创建一个临时对象,并将引用绑定到该对象.您只是修改临时对象.

对类型"cv1 T1"的引用由类型"cv2 "的表达式初始化,T2如下所示:

  • 如果参考是左值参考[...]

  • 否则,[...]或参考应为右值参考.

    • 如果是初始化表达式

      • 是xvalue(但不是位字段),类prvalue,数组prvalue或函数lvalue [...],或者

      • 有班级类型[...]

      [...]

    • 否则,将T1使用非引用复制初始化(8.5)的规则从初始化表达式创建并初始化类型为"cv1 " 的临时类型.然后将引用绑定到临时.

从概念上讲,prvalue只是一个值,可能是也可能不是来自内存中的某个对象.文字在内存中没有相应的对象,因此该规则强制创建对象.