2016-05-30 52 views
6

由于C++提供对rvalues的引用,即主要用于执行移动语义和其他内存高效任务的rvalue引用。但在以下情况下,引用正在改变文字的值,但我们知道文字是只读的,所以引用如何改变某些只读变量的值。一个右值引用是否分配它自己的内存,或者它只是改变了字面值?其次,当一个临时对象被分配一个引用时,引用与该对象的数据一起工作。但是根据临时对象的定义,它们被删除,就像使用它们的表达式结束一样。如果临时对象内存不足,引用如何作为该临时对象的别名?C++:右值引用存储器

回答

12

数字文字不能绑定到任何引用,既不是右值引用也不是左值引用。从概念上讲,数字文字创建一个从文字值初始化的临时对象,并且该临时对象可以绑定到右值引用或左值引用(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),直到完成包含调用的完整表达式。
  • 在函数return语句(6.6.3)中临时绑定到返回值的生命周期不会被扩展;在return语句的完整表达式的末尾临时被销毁。
  • 临时绑定到新初始值设定项(5.3.4)中的引用,直到完成包含新初始值设定项的完整表达式。
+0

嘿从中引用你告诉段号码,如'(5.1.1)段1' –

+1

@HarshulSharma:我引用替代C++标准在后的时间。如果上述文章是ISO/IEC 14882:2014。这些文件可以从国家标准化组织购买。一些_drafts_可用(请参阅[打开标准](http://www.open-std.org/JTC1/SC22/WG21/)页面的某些链接)。我的参考文献通常包括章节号和_stable reference_,例如“[expr.prim.general]”:章节号,确切的措词和段落编号可能会改变,但稳定的参考文献仍然存在。所引用的文本使用引用文本中的引用。 –

+0

谢谢我不知道WG21也会发布最终稿。我只是认为他们只是针对不同的概念发布不同的草案。现在我想我得到了一个可靠的参考。非常感谢:) :) –