Type stimmt nicht überein, wenn ein Abschluss behoben wird, für den Argumente als Referenz verwendet werden

Beim Kompilieren meines Rust-Codes ist mir ein seltsames Fehlerpaar aufgefallen. Bei der Suche nach anderen mit ähnlichen Problemen bin ich auf @ gestoß eine andere Frage mit der gleichen Kombination von (scheinbar gegensätzlichen) Fehlern, konnte aber die Lösung für mein Problem nicht verallgemeinern.

Grundsätzlich scheint mir eine Subtilität in Rusts Besitzsystem zu fehlen. Beim Versuch, den (sehr reduzierten) Code hier zu kompilieren:

struct Point {
    x: f32,
    y: f32,
}

fn fold<S, T, F>(item: &[S], accum: T, f: F) -> T
where
    F: Fn(T, &S) -> T,
{
    f(accum, &item[0])
}

fn test<'a>(points: &'a [Point]) -> (&'a Point, f32) {
    let md = |(q, max_d): (&Point, f32), p: &'a Point| -> (&Point, f32) {
        let d = p.x + p.y; // Standing in for a function call
        if d > max_d {
            (p, d)
        } else {
            (q, max_d)
        }
    };

    fold(&points, (&Point { x: 0., y: 0. }, 0.), md)
}

Ich erhalte die folgenden Fehlermeldungen:

error[E0631]: type mismatch in closure arguments
  --> src/main.rs:23:5
   |
14 |     let md = |(q, max_d): (&Point, f32), p: &'a Point| -> (&Point, f32) {
   |              ---------------------------------------------------------- found signature of `for<'r> fn((&'r Point, f32), &'a Point) -> _`
...
23 |     fold(&points, (&Point { x: 0., y: 0. }, 0.), md)
   |     ^^^^ expected signature of `for<'r> fn((&Point, f32), &'r Point) -> _`
   |
   = note: required by `fold`

error[E0271]: type mismatch resolving `for<'r> <[closure@src/main.rs:14:14: 21:6] as std::ops::FnOnce<((&Point, f32), &'r Point)>>::Output == (&Point, f32)`
  --> src/main.rs:23:5
   |
23 |     fold(&points, (&Point { x: 0., y: 0. }, 0.), md)
   |     ^^^^ expected bound lifetime parameter, found concrete lifetime
   |
   = note: required by `fold`

(Ein Rust Playground-Link für diesen Code.)

Es scheint mir, dass die Funktion, die ich zu @ liefefold sollte die Schreibweise richtig prüfen ... was fehlt mir hier und wie kann ich das beheben?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage