2012-02-15 55 views
5

爲了阻止論點的an answer I gave recently評論的時候,我想了一些建設性的回答以下問題:就其目標參考的壽命

  1. 是一個參考的生命週期不同從它指的對象?參考只是其目標的別名嗎?
  2. 參考文獻能否在一個格式良好的程序中超越其目標而不會導致未定義的行爲?
  3. 如果爲原始對象分配的存儲空間被重用,是否可以引用新對象?
  4. 下面的代碼是否演示了上述幾點而未調用未定義的行爲?

實施例的代碼由Ben Voigt和簡化(上ideone.com運行它):

#include <iostream> 
#include <new> 

struct something 
{ 
    int i; 
}; 

int main(void) 
{ 
    char buffer[sizeof (something) + 40]; 
    something* p = new (buffer) something; 
    p->i = 11; 
    int& outlives = p->i; 
    std::cout << outlives << "\n"; 
    p->~something(); // p->i dies with its parent object 
    new (p) char[40]; // memory is reused, lifetime of *p (and p->i) is so done 
    new (&outlives) int(13); 
    std::cout << outlives << "\n"; // but reference is still alive and well 
            // and useful, because strict aliasing was respected 
} 
+0

這是一大堆問題,每個問題都需要相當一些標準的措詞引用才能正確回答(鑑於問題的性質,我認爲您期望標準引用是正確答案)。如果我們應該專注於其中的一個,它/可能會更有用,如果在這方面有用,只回答其他人... – PlasmaHH 2012-02-15 10:15:14

+0

我同意。請問每個問題有一個問題。你會發現以前的子問題已經回答了。 – 2012-02-15 10:24:10

+0

此外,該代碼示例還有很多事情要做。製作一個小型測試用例。 – 2012-02-15 10:24:28

回答

9

是一個參考的生命週期從它引用的對象不同?參考只是其目標的別名嗎?

參考有它自己的壽命:

int x = 0; 
{ 
    int& r = x; 
}  // r dies now 
x = 5; // x is still alive 

一個REF-TO- const另外可以延伸它的裁判的壽命:

int foo() { return 0; } 
const int& r = foo(); // note, this is *not* a reference to a local variable 
cout << r;    // valid; the lifetime of the result of foo() is extended 

雖然這也不是沒有注意事項:

對const的引用只會延長生命週期o如果引用是a)local,並且b)綁定到評估創建所述臨時對象的prvalue,則爲臨時對象。 (所以它不適用於成員或綁定到xvalues的本地引用。)另外,非const rvalue引用以完全相同的方式延長了生命週期。 [@FredOverflow]


可以參考活得比其目標在形成阱程序,而不會導致未定義的行爲?

當然,只要你不使用它。


可以參考進行,如果分配給原始對象存儲再次用來指一個新對象?

是的,在一定條件下:

[C++11: 3.8/7]:如果一個對象的生命週期已經結束,之後佔領了對象重用或釋放的存儲之前,一個新的對象在存儲上創建原始對象佔據的位置,指向原始對象的指針,引用原始對象的引用或原始對象的名稱將自動引用新對象,並且一旦新對象的生存期開始,可用於操縱新對象,如果:

  • 存儲爲新對象恰好覆蓋其原始對象所佔據的存儲位置,和
  • 新的對象是相同的類型與原始對象(忽略頂層cv修飾符)的,和
  • 原始對象的類型不是const限定的,並且如果類類型不包含任何類型爲const限定或引用類型的非靜態數據成員,並且原始對象是T類型的大多數派生對象(1.8),而新對象是類型T的最派生對象(也就是說,它們不是基類子對象)。

執行以下代碼演示了無需調用不確定的行爲上面幾點?

Tl; dr。

+0

對const的引用只在引用是a)local時纔會擴展臨時對象的生命週期,並且b)會將其綁定到一個prvalue,該prvalue的求值將創建所述臨時對象。 (所以它不適用於成員或綁定到xvalues的本地引用。)另外,非const rvalue引用以完全相同的方式延長了生命週期。 – fredoverflow 2012-02-15 10:24:19

+0

@FredOverflow:Ta! – 2012-02-15 10:48:47

5
  1. 是。例如,本地非靜態引用具有自動存儲持續時間和相應的liifetime,並且可以引用具有較長生存期的對象。

  2. 是的,懸掛引用就是一個例子。只要這些引用在任何表達式中沒有被使用,當它們變成懸掛時,它們就沒有問題。

  3. 關於這種情況,在第3款中有特別規定。對象,指針和引用的名稱會自動引用在受限制條件下重新使用存儲的新對象。我相信它是在3.8的末尾。有規格的人請在這裏填寫正確的參考。