2011-07-16 23 views
4

一般來說,這是討論最多隻能局部功能變量:什麼是常數引用右值的類數據成員的生命週期?

void foo (const int &i) 
{ 
    // use i till foo() ends 
} 
foo(3); 

但是,沒有此規則適用於class成員也?

struct A { 
    const int &a; 
    A() : a(3) {} // version 1 
    A (const int &i) : a(i) {} // version 2 
}; 

現在作爲A

{ 
    return()? new A : new A(3) : new A(some_local_variable); 
} 

意志a內容保持相同通過了所有3new LY分配A的續航時間?

+0

一般來說,壽命不夠長。從12.2/5開始:「在函數調用(5.2.2)中臨時綁定到引用參數,直到完成包含調用的完整表達式。」有關完整的詳細信息,請參閱http://stackoverflow.com/questions/2604206/c-constant-reference-lifetime/2604269#2604269。 –

+0

但是,我應該注意,將const引用綁定到文字「3」是沒問題的,因爲沒有生成臨時文件,並且文本的生命週期超過了'A'對象的生命週期。但是,如果轉換是必要的,那麼這不會成立。 –

回答

3

的C++ 03標準(章節「12.2/5的臨時對象」)恰當地回答您的問題:

到其中參考結合臨時或暫時認爲是完整的對象到一個子對象的臨時綁定持續參考的生命週期,除非如下所述。 臨時綁定到構造函數的ctor-initializer(12.6.2)中的引用成員,直到構造函數退出。臨時綁定到函數調用中的引用參數(5.2.2)直到完成包含調用的完整表達式。

+0

那麼在這種情況下,像1,2,3這樣的右值也會被視爲臨時值? – iammilind

+0

@iammilind:是的,我相信。 –

+0

嗯,我聽說這樣的值存儲像只讀內存區域中的字符串文字。但是,您的答案在一般意義上是正確的。我接受它將「規格」放入其中。 – iammilind

2

如果你使用new分配一個對象,它將永遠留在內存中 - 直到你delete它。這不是一個臨時對象。

aA的成員,並作爲此類分配的一部分。

編輯:感謝您的意見。我會說 - 不,這是不正確的。試想一下:

struct A { 
    const int &a; 
    A() : a(3) {} // version 1 
    A (const int &i) : a(i) {} // version 2 
}; 

void foo() { 
    A *pA; 

    { 
    int x; 
    pA = new A(x); 
    } 

    // Now pA->a is pointing to the address where `x` used to be, 
    // but the compiler may very well put something else in this place now 
    // because x is out of scope. 
} 

答案是比較明顯的,如果A對象的生命週期橫跨幾個功能跨越。

附註:我發現「內容」一詞在這裏有點含糊。將參考等同於一個指針,所以你的a基本上指向一個整數。 const,如果整數不再存在(因爲它在堆棧中並且已被刪除),你的a - 仍然指向內存中的相同地址 - 現在正在引用其他的東西。 GotW文章似乎在談論編譯器延長引用指向的對象的生命週期。參考本身也是一個指針。

+0

我認爲OP在詢問[GotW#88中描述的情況](http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/ )也適用於'const'引用數據成員。 –

+0

我的意思是'a'的內容。 – iammilind

+1

對不起,我誤讀了。這實際上是一個很好的問題,我很想說「不」,它是無效的,因爲問題更多地是關於被引用對象的有效性。但是,我可能會刪除我的答案,因爲這只是我的猜測。 – EboMike

相關問題