Времена жизни, подтипизация, вариантность
Аннотации и правила пропуска, 'static, подтипизация через заменяемость, три вида вариантности, HRTB.
Тема объясняет времена жизни (lifetimes): аннотация 'a не продлевает жизнь значения, а описывает связь между ссылками, которую проверяет компилятор. Вопросы проверяют, когда аннотация обязательна (ссылка в поле структуры, возврат ссылки из функции), что требует граница T: 'a и в каких случаях функцию можно записать без аннотаций по правилам пропуска (lifetime elision). Раздел о 'static различает 'static как время жизни ссылки и как границу T: 'static, разбирает &'static str, требование F: 'static у thread::spawn, неявное + 'static у Box<dyn Trait>, Box::leak и продвижение констант. Разделы о подтипизации (subtyping) и вариантности (variance) показывают, почему &'static str подходит там, где ожидается &'a str, чем ковариантность отличается от контравариантности и инвариантности, почему &mut T инвариантен по T и как вариантность структуры выводится из её полей и PhantomData. Последний раздел посвящён границам высшего ранга (HRTB): смыслу for<'a> в ограничении, записи Fn(&T) -> &U и случаям, когда замыкание, возвращающее ссылку, не компилируется без явной границы.
38 вопросов: базовый уровень — 16, средний — 17, углублённый — 5. 6 справок, 16 источников.
Разделы
- Аннотации и синтаксис
- Правила пропуска
'static: тип и граница- Подтипизация и заменяемость
- Вариантность: ко-, контра-, инвариантность
- Границы высшего ранга (HRTB)
Предыдущая тема: Заимствование, ссылки, NLL · Следующая тема: Структуры, перечисления, сопоставление