Do tej pory zakładałem, że tymczasowy został zniszczony na końcu oceny oświadczenia, które go zainicjowało.Kiedy jest tymczasowo zniszczony?
Jednak wydaje się, że wystąpił wyjątek podczas używania tymczasowego w celu zainicjowania pola struct
.
PeterHall usłużnie warunkiem prosty code sample illustrating the difference w komentarzu do his answer, co mam
uproszczone
trochę skomplikowane:
struct Wrapper<'a> {
cmd: &'a Cmd<'a>,
}
struct Cmd<'a> {
args: &'a Option<String>,
}
impl <'a> Cmd<'a> {
fn new(args: &'a Option<String>) -> Cmd<'a> {
Cmd {
args: args,
}
}
}
pub fn main() {
// OK
let cmd = Cmd {
args: &None,
};
// OK
let cmd = Wrapper {
cmd: &Cmd {
args: &None,
}
};
// Lifetime error
let cmd = Some(Cmd {
args: &None,
});
// Lifetime error
let cmd = Cmd::new(&None);
}
tak, jaka jest dokładna zasada gdy tymczasowa jest zniszczona? wygląd
Nie znam wyjaśnienia, ale na pewno nie jest to zgodne. – Boiethios
Odczucia związane z aspektem "sprawdzanie żywotności zatrzymuje się na granicach funkcji". Sprawa ma wbudowany inicjalizator struktury, przez co jest bardziej "przezroczysty" dla kompilatora, a niepowodzenie to wywołanie funkcji. – Shepmaster
@Shepmaster: To może być coś takiego, po wszystkim pożyczanie działa niezależnie dla pól zmiennej lokalnej, ale nie dla wywołań funkcji. –