这个函数是否自动解引用向量?



我想知道为什么list[0]number_list[0]有相同的地址。

根据我的理解,我们在for_question4中传递了对number_list的引用,所以list应该是对number_list的引用。当我们在for_question4中调用list[0]时,它应该与&number_list[0]相同。

但是当我打印地址时,list[0]number_list[0]在同一个地址上。&list[0]&number_list[0]在同一个地址

函数是否自动解引用传递给它的向量?自动解引用在Rust中是一个东西吗?如果有,它在什么条件下会这样做?
fn for_question4(list: &[&str]) {
println!("call index without reference {:p}", list[0]); // 0x103d23d5d
println!("call index with reference {:p}", &list[0]); // 0x7fea9c405de0
}
fn main() {
let number_list = vec!["1", "2", "3"];
let result = for_question4(&number_list);
println!("call index without reference {:p}", number_list[0]); // 0x103d23d5d
println!("call index with reference {:p}", &number_list[0]); // 0x7fea9c405de0
println!("call index with two reference {:p}", &&number_list[0]); // 0x7ffeebf46f80
}

[]运算符&运算符之前求值。[]操作符自动解引用。

下面是一些例子:

fn main() {
let n = vec!["1", "2", "3"];
println!("      n[0]  {:p}", n[0]);
println!("   (&n)[0]  {:p}", (&n)[0]);
println!("  (&&n)[0]  {:p}", (&&n)[0]);
println!("     &n[0]  {:p}", &n[0]);
println!("    &(n[0]) {:p}", &(n[0]));
println!(" &((&n)[0]) {:p}", &((&n)[0]));
println!("&((&&n)[0]) {:p}", &((&&n)[0]));
}
n[0]  0x5597b8ccf002
(&n)[0]  0x5597b8ccf002
(&&n)[0]  0x5597b8ccf002
&n[0]  0x5597b9f3fad0
&(n[0]) 0x5597b9f3fad0
&((&n)[0]) 0x5597b9f3fad0
&((&&n)[0]) 0x5597b9f3fad0

多亏了@Finomnis

是索引操作符([])自动解引用。根据参考:

对于其他类型的索引表达式a[b]等效于可变位置表达式上下文中的*std::ops:: index::index(&a, b)或*std::ops::IndexMut::index_mut(&mut a, b)。和方法一样,Rust也会在上插入解引用操作。反复寻找实现。

最新更新