Учитывая этот код:Почему для хранения ссылки `& 'a T` требуется связанная` T:' a`?
struct RefWrapper<'a, T> {
r: &'a T,
}
... компилятор жалуется:
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: 'a
.
Насколько я понял, уже невозможно получить такую ссылку. Имея &'a T
, подразумевается, что существует объект типа T
, который проживает не менее 'a
. Но мы не можем хранить ссылки в указанном объекте, которые указывают на данные, имеющие более короткий срок службы, чем 'a
. Это будет уже приведет к ошибке компилятора.
В этом смысле уже невозможно получить &'a T
, где T
не пережить 'a
. Таким образом, дополнительная аннотация (T: 'a
) не требуется.
Я прав? Я ошибаюсь, и если да: как я могу сломать код, если T: 'a
не требуется?
Ссылки:
I спросил #rust и кажется, что [этот код] (https: // github.ru/rust-lang/rust/issues/24622 # issuecomment-94761287) сломает вещи, если требование 'T: 'a' было отменено. Но я пока не понимаю этот код, и сейчас я перестану пытаться. Надеюсь, кто-то, кто понимает проблему, отвечает тем временем^_^ –
[Соответствующий RFC от августа 2017 года (https://github.com/rust-lang/rfcs/pull/2093) –