2016-05-30 46 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也會發布最終稿。我只是認爲他們只是針對不同的概念發佈不同的草案。現在我想我得到了一個可靠的參考。非常感謝:) :) –