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

时间:2013-03-27 11:33:52

标签: c++ c++11 rvalue

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

int && a = 3;
a = 4;

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

1 个答案:

答案 0 :(得分:7)

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

  

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

     
      
  • 如果引用是左值引用[...]

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

         
        
    • 如果是初始化表达式

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

      •   
      • 有一个班级类型[...]

      •   
           

      [...]

    •   
    • 否则,将创建一个临时类型为“cv1 T1”的,并使用非参考拷贝初始化(8.5)的规则从初始化表达式初始化。然后将引用绑定到临时。

    •   
  •   

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