You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust如何处理单表达式中生成的引用的引用的中间值?

Rust vs C: 为什么单表达式多级指针/引用在Rust合法,C却报错?

嘿,这个细节确实值得掰扯清楚!我来给你拆解下两者的差异:

Rust的处理逻辑

在Rust中,你完全可以在单表达式里直接创建引用的引用或者指针的指针,比如你写的这段代码:

let i = 0;
let irr = &&i;
let ipp: *const *const i32 = &&i as *const *const i32;

这背后的原因是Rust编译器会自动为中间的临时引用分配匿名存储。简单说,当你写&&i时,编译器会悄悄生成一个隐藏的临时变量来持有&i这个一级引用,然后再对这个临时变量取引用,最终得到二级引用&&i。不管是转成指针的指针还是直接用引用,这个逻辑都能正常工作,编译器帮你把临时存储的问题处理得明明白白。

C的限制原因

但在C里,类似的写法就会直接编译报错。比如你尝试写:

int i = 0;
int **ipp = &&i; // 编译失败!

这是因为C语言里的取地址运算符&返回的是一个右值——右值是没有持久存储位置的临时值,C的规则不允许对右值再次取地址。你必须先把一级指针存到一个显式的左值变量里,才能对它取地址得到二级指针:

int i = 0;
int *ip = &i;
int **ipp = &ip; // 这样就合法了

这里ip是一个有自己存储位置的左值,对它取地址完全符合C的规则。

本质差异

说白了,这是两个语言对临时值的处理策略不同:Rust编译器会主动为这种多级引用场景兜底,创建必要的临时存储;而C则严格遵循左值/右值的边界,要求开发者显式提供可被取址的左值变量。

内容的提问来源于stack exchange,提问作者djrollins

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:27:25