разница между баундом T:'a и t: &'a T ? И зачем может понадобиться баунд к лайфтайму у owned-типа? К примеру:
fn take_ref<'a, T: 'a>(t: &T) {}
fn take_ref_1<'a, T>(t: &'a T) {}
fn own<'a, T: 'a>(t: T) {}
легко провести пример для экстремального кейса: T: 'static означает что в T нет не статичных ссылок, это значит что значение может жить пока не перестанет и его можно например в другой тред спокойно передать
опять же T не обязательно значит owned, T = &U это вполне валидная штука
Не-не, это я понимаю. Я просто не совсем пойму, как я могу использовать это свойство.
Хммм, счас немного поигрался. Почему компилятор требует явного указания лайфтайма здесь ? (17 строка). Ведь мы в дефинишне T указали баунд к 'a. https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=767c8d66014ab3f8c3ad8e886c636083
Эм, а это как ?
То есть, вот как раз таки я об этом и спрашивал. В чем разница баунда T и баунда на ссылку T
Т - может быть ссылкой или содержать ссылку с лайфтаймом 'a А ссылка на него может быть &'b T, 'a: 'b Происходит очень легко, если ссылка живёт меньше чем то, на что она ссылается
Если я с ссылки убираю явный лайфтайм, то: error[E0621]: explicit lifetime required in the type of `t` --> src/main.rs:20:5 | 17 | fn take_ref<'a, T: 'a + Empty>(t: &T) -> Bar<'a> { | -- help: add explicit lifetime `'a` to the type of `t`: `&'a T` ... 20 | Bar { foo: boxed } | ^^^^^^^^^^^^^^^^^^ lifetime `'a` required
О, теперь до меня дошло. Спасибо большое. То есть, &'a - ссылка на сам объект. T:'a баунд, говорящий о том, что ссылка (если она имеется), внутри T живет по-крайне мере 'a. Правильно понял ?
Что сам Т живёт минимум 'а. Там внутри необязательно должна быть ссылка, может фантом дата быть Если что, то любой объект без ссылок это T: 'static. Например, тот же вектор это &'a T: 'static, если его элементы 'static. Потому вектор может жить сколько угодно, передавая владение до конца программы. А его ссылка нет
Понял. Спасибо большое!
так у тебя тогда ссылка (которую ты кастуешь в &'a Empty) может жить меньше 'a
Обсуждают сегодня