2017-01-22 92 views
19

鑑於這種代碼:爲了存儲引用'&'a T`,爲什麼需要綁定`T:'a`?

struct RefWrapper<'a, T> { 
    r: &'a T, 
} 

...編譯器會抱怨:

error: the parameter type T may not live long enough

consider adding an explicit lifetime bound T: 'a so that the reference type &'a T does not outlive the data it points at.

我已經看到了這個錯誤已經多次,到目前爲止,我只是聽取了編譯器,一切都制定了罰款。但是,多想一想,我不明白爲什麼我要寫T: 'a

據我瞭解,這是已經不可能得到這樣的參考。有&'a T意味着有一個T類型的對象至少生存'a。但是我們不能在所述對象中存儲任何指向壽命比'a短的數據。這會已經導致編譯器錯誤。

從這個意義上說,已經不可能得到&'a T,其中T沒有超過'a。因此,額外註釋(T: 'a)不應該是必需的。

對嗎?我錯了,如果是的話:如果T: 'a將不需要?我怎麼能破壞代碼?


鏈接:

+1

我問#rust,似乎[此代碼](https:// github。com/rust-lang/rust/issues/24622#issuecomment-94761287)如果解除了'T:'a'要求,將會破壞事情。但我並不真正瞭解這些代碼,現在我將停止嘗試。希望能夠理解這個問題的人在此期間得到答案^ _^ –

+0

[https://github.com/rust-lang/rfcs/pull/2093](https://github.com/rust-lang/rfcs/pull/2093) –

回答

15

這是良好性規則的一部分。 &'a T只有在T: 'a(「T超過a」;這是必需的,因爲我們有一個參考,我們可以在範圍'a中訪問; T中指向的值需要至少有效範圍也是如此)。

struct RefWrapper<'a, T>是一個通用類型,它說你可以輸入一生的'x和類型U並得到一個RefWrapper<'x, U>類型回來。然而,除非要求T: 'a得到尊重,否則這種類型不一定是良構或甚至實施的。

該要求來自實現細節;這不一定是因爲T'a在結構的內部一起使用,如&'a T。井形成要求需要提升到RefWrapper結構的公共接口,以便形成​​3210類型的要求是公開的,即使內部實現不是。

(還有其他地方同樣的要求T: 'a回來,但隱:

pub fn foo<'a, T>(x: &'a T) { } 

我們發現一個區別:這裏的類型&'a T是公共API的一部分,太)

+0

這很有道理,謝謝<3 –