Изменяемые ссылки инвариантны по отношению к типу, к которому они относятся.Если у вас &'a mut T
, то он инвариантен относительно T
.Подпись swap()
предполагает одинаковые типы с одинаковым временем жизни для обоих входных аргументов.то есть они оба являются изменяемыми ссылками на T
.
Давайте посмотрим на вашу проблему:
Аргумент foo()
равен &T
, а со временем жизни он будет foo<'a, T: Copy>(mut x: &'a T)
, и этовремя жизни определяется абонентом.Внутри функции у вас есть локальная переменная y_owned
, и вы берете ссылку на нее с некоторым локальным временем жизни.Таким образом, на данный момент у нас есть &'a T
, который является входным аргументом с временем жизни, установленным вызывающей стороной, и &'local y_owned
с некоторым локальным временем жизни.Все хорошо!
Далее вы вызываете swap()
и передаете ему изменяемые ссылки (&mut &T
и &mut &y_owned
) на вышеупомянутые ссылки.Теперь вот подвох;Поскольку они являются изменчивыми ссылками и, как уже упоминалось, они инвариантны относительно того, на что они указывают;x
, равное &'a T
, не будет сокращаться до объема вызова функции, в результате теперь ожидается, что y
, равное &'local y_owned
, также будет &'a y_owned
, что невозможно, поскольку 'a
выходит за пределы y_owned
, поэтому жалуется, что y_owned
не живет достаточно долго.
Для получения дополнительной информации, пожалуйста, обратитесь к этому