Với mã này:Tại sao liên kết `T: 'a` bắt buộc để lưu trữ tham chiếu` &' a T`?
struct RefWrapper<'a, T> {
r: &'a T,
}
... trình biên dịch phàn nàn:
error: the parameter type
T
may not live long enoughconsider adding an explicit lifetime bound
T: 'a
so that the reference type&'a T
does not outlive the data it points at.
Tôi đã nhìn thấy lỗi này nhiều lần rồi và cho đến nay tôi chỉ nghe trình biên dịch và tất cả mọi thứ đã làm việc ra tốt đẹp . Tuy nhiên, suy nghĩ thêm về nó, tôi không hiểu lý do tại sao Tôi phải viết T: 'a
.
Theo như tôi hiểu, đó là đã không thể có được tham chiếu như vậy. Có &'a T
ngụ ý rằng có một đối tượng thuộc loại T
sống ít nhất 'a
. Nhưng chúng tôi không thể lưu trữ bất kỳ tài liệu tham khảo nào trong đối tượng đã nói đến dữ liệu có tuổi thọ ngắn hơn 'a
. Điều này sẽ đã dẫn đến lỗi trình biên dịch.
Trong ý nghĩa đó, bạn không thể nhận được số &'a T
trong đó T
không vượt quá 'a
. Do đó, chú thích bổ sung (T: 'a
) không cần thiết.
Tôi có đúng không? Tôi có sai và nếu có: làm thế nào tôi có thể phá vỡ mã, nếu T: 'a
sẽ không được yêu cầu?
Links:
tôi đã hỏi #rust và có vẻ như [mã này] (https: // github.com/rust-lang/rust/issues/24622 # issuecomment-94761287) sẽ phá vỡ mọi thứ, nếu yêu cầu 'T: 'a' được dỡ bỏ. Nhưng tôi chưa thực sự hiểu mã đó và tôi sẽ ngừng thử ngay bây giờ. Hy vọng rằng ai đó hiểu được câu trả lời trong thời gian chờ đợi^_^ –
[RFC liên quan từ tháng 8 năm 2017] (https://github.com/rust-lang/rfcs/pull/2093) –