2013-03-27 42 views
0

我已阅读,下面的代码是有效的在C++ 11:这段代码应该做什么? (参照右值)

int && a = 3; 
a = 4; 

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

+0

1.是和2. No. – 2013-03-27 11:35:31

回答

7

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

输入“CV1 T1”的引用由类型“CV2 T2”的表达如下初始化:

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

  • 否则,或参考文献应为参考文献

    • 如果初始化表达式

      • 是一个x值(但不是一个位域),类prvalue,阵列prvalue或功能左值[...],或

      • 具有类类型[...]

      [...]

    • 否则,创建类型为“cv1 T1”的临时文件,并使用非引用复制初始化(8.5)的规则从初始化器表达式初始化。然后参考文件被绑定到临时文件。

概念上讲,prvalue仅仅是可以或不可以有来自在存储器中的某些对象的值。文字在内存中没有相应的对象,所以这个规则强制一个对象被创建。

+1

你和我有一天在看这个。 :)不错的巧合。 – GManNickG 2013-03-27 22:31:17