2012-04-28 65 views
0

考慮一下:常量參數壽命在C++

void l(Event const& e) 
{ 
    KeyEvent& k = (KeyEvent&)e; 
    std::cout<<k.action<<" "<<k.keyCode; 
} 

void k(Event const& e) 
{ 
    KeyEvent& k = (KeyEvent&)e; 
    std::cout<<k.action<<" "<<k.keyCode; 
} 

void t(Event const& e) 
{ 
    l(e); 
    k(e); 
} 

int main(int argc, char* argv[]) 
{ 
    t(KeyEvent(1,1)); 
} 

何時該KeyEvent對象從內存中釋放(範圍結束還是我不得不刪除後它)?如果這個KeyEvent實際上被傳遞了很多,我可以肯定它會保持有效,直到使用它的最後一個函數結束爲止。

+0

@ildjarn:哪裏是未定義的行爲?這就像'static_cast'一樣,只要目標類型匹配對象的運行時類型,它就可以向下轉換。它的確如此...... – 2012-04-28 03:44:45

+1

@Ben:它也像一個'const_cast'一樣,拋棄了臨時性的常量。 – ildjarn 2012-04-28 03:45:40

+1

@ildjarn:臨時不是'const',所以也是允許的。 – 2012-04-28 03:46:06

回答

4

什麼時候將KeyEvent對象從內存中釋放(是否在作用域結束後還是必須刪除它)?

它生活在內存,直到完全表達這是語句的分號;結束:

t(KeyEvent(1,1)); 
       ^end of the full-expression 

順便說一句,你應該const這裏(避免的問題):

KeyEvent const& k = (KeyEvent const&)e; //added const on both side 
+0

從嚴肅的角度講,如果我不把const加入到演員陣容中,我可以期待什麼樣的問題? – 2012-04-28 04:01:35

+0

@LukeB .:你可以在函數中修改*'k',編譯器不會告訴你它引用的對象是一個* const *對象(當它真的是const對象,比如說你通過的時候該函數的一個const對象)。 – Nawaz 2012-04-28 04:04:35

+0

我明白了,感謝您的幫助:) – 2012-04-28 04:24:47