我以前认为这与lvalue reference collapsing in C++类似,因此从语法的角度来看,&&T
应该与&T
相同,但是在编译以下代码后我感到困惑:
fn check_ref(x: &i32) -> i32 {
println!("{}", x);
x + 2
}
fn main() {
for i in &[-3, 2, 39] {
// i is &i32
check_ref(i); // this works
check_ref(&i); // this works
check_ref(&&i); // this works
assert_eq!(i, &i); // error[E0277]: can't compare `i32` with `&i32`
}
}
是不是多个引用都折叠了,或者ref-to-ref是否具有其他特定含义?
assert_eq!
的此编译器错误是否仅是由于Rust宏的一些技巧造成的?