2012-03-06 75 views
6

可能重複:
Does a const reference prolong the life of a temporary?當我將一個臨時int分配給C++中的const引用時會發生什麼?

讓說,我有一個函數f

int f(int x){return x;} 

const int &a=f(1); 

我知道f(1)只是暫時的,我會在此聲明後銷燬,但

  1. 確實使得參考常量會給f(1)一個很長的壽命嗎?
  2. 如果是,其中f(1)將被存儲?
  3. 這是否意味着x在超出範圍時也沒有被破壞?
  4. f(1)x有什麼區別?
+0

你需要一本好的C++書。參見http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list – 2012-03-06 14:27:52

+4

@Ben很少(甚至是好的)書籍涵蓋了這一點。 – 2012-03-06 14:30:30

+0

@Konrad:也許他是指最後一個問題...... – 2012-03-06 14:31:40

回答

8

您正在將表達式與值混淆。

1)由表達式f(1)返回的臨時值的生存期將延長其生存期。此規則對於const引用是唯一的。 2)編譯器需要的地方,但可能在堆棧上。

3)也許吧。這取決於編譯器是複製了x還是執行了copy elision。由於類型是int,這並不重要。

4)很多差異。一個是int f(int)內的局部變量的名稱。這是一個左翼。另一種是稱爲int f(int)並且評估爲右值的表達式。

+0

:我知道表達式返回值,但如何將這些值存儲在f(1)中,編譯器是否簡單地將f(1)賦值爲1:int f(1)= 1 ;或者是其他東西 ? – AlexDan 2012-03-06 14:48:44

2

將臨時文件綁定到const&會將臨時文件的生命週期延長到引用的生命週期。

+0

如果它延長了臨時的生命週期,那麼f(1)被存儲,並且它有自己的地址,並且可以像普通變量那樣改變? – AlexDan 2012-03-06 14:31:15

+0

@AbdessamadBond它是否可以像普通變量一樣改變是(我認爲)一個開放的問題;你需要一個'const_cast'來改變它,即使如此,結果可能是未定義的行爲。 (我認爲其意圖是它們是未定義的行爲,但我很難確定需要這樣的措辭實際上是否出現在標準中) – 2012-03-06 14:39:51

+0

@JamesKanze UB可能由const_cast引起的唯一情況是如果對象已被聲明爲「const」。據我所知,臨時決不是這種情況。 – pmr 2012-03-06 14:53:57

相關問題