В С++ (пожалуйста, исправьте меня, если не так), временная привязка с помощью постоянной ссылки должна пережить выражение, к которому она привязана. Я предполагал, что то же самое было в Rust, но я получаю два разных поведения в двух разных случаях.
Рассмотрим:
struct A;
impl Drop for A { fn drop(&mut self) { println!("Drop A.") } }
struct B(*const A);
impl Drop for B { fn drop(&mut self) { println!("Drop B.") } }
fn main() {
let _ = B(&A as *const A); // B is destroyed after this expression itself.
}
Вывод:
Drop B.
Drop A.
Это то, чего вы ожидаете. Но теперь, если вы это сделаете:
fn main() {
let _b = B(&A as *const A); // _b will be dropped when scope exits main()
}
Вывод:
Drop A.
Drop B.
Это не то, что я ожидал.
Предполагается ли это, и если да, то в чем причина разницы в поведении в двух случаях?
Я использую Rust 1.12.1.