尽管仔细阅读了文档,但我还是对Rust中&*符号的含义感到困惑,更普遍的是,什么是Rust参考.

在这个例子中,它看起来类似于C++引用(即,当使用时自动撤销引用的地址):

fn main() {
    let c: i32 = 5;
    let rc = &c;
    let next = rc + 1;
    println!("{}", next); // 6
}

但是,以下代码的工作原理完全相同:

fn main() {
    let c: i32 = 5;
    let rc = &c;
    let next = *rc + 1;
    println!("{}", next); // 6
}

*来引用引用在C++中是不正确的.所以我想理解为什么这在Rust中是正确的.

到目前为止,我的理解是,在Road引用前面插入*,但是,*是隐式插入的,因此不需要添加它(而C++中,它是隐式插入的,如果插入它,就会得到编译错误).

然而,类似这样的东西无法编译:

fn main() {
    let mut c: i32 = 5;
    let mut next: i32 = 0;
    {
        let rc = &mut c;
        next = rc + 1;
    }
    println!("{}", next);
}
error[E0369]: binary operation `+` cannot be applied to type `&mut i32`
 --> src/main.rs:6:16
  |
6 |         next = rc + 1;
  |                ^^^^^^
  |
  = note: this is a reference to a type that `+` can be applied to; you need to dereference this variable once for this operation to work
  = note: an implementation of `std::ops::Add` might be missing for `&mut i32`

但这是可行的:

fn main() {
    let mut c: i32 = 5;
    let mut next: i32 = 0;
    {
        let rc = &mut c;
        next = *rc + 1;
    }
    println!("{}", next);  // 6
}

似乎隐式撤销(LaC++)对于不可变引用是正确的,但对于可变引用似乎是正确的.这是为什么?

推荐答案

使用*来引用引用在C++中是不正确的.所以我想理解为什么这在Rust中是正确的.

C++中的引用与 rust 中的引用不相同.Rust的引用(在用法上,而不是语义上)与C++的指针更接近.关于内存表示,Rust的引用通常只是一个指针,而C++的引用应该是同一对象的替代名称(因此没有内存表示).

C++指针和 rust 迹引用的区别在于,RIST的引用从来都不是NULL,从不初始化,也不会悬空.


为以下对和所有其他数字原语实现了Add特征(见文档页面底部):

  • &i32 + i32
  • i32 + &i32
  • &i32 + &i32

这只是std-lib开发人员实现的一件方便的事情.编译器可以计算出,&mut i32可以在任何可以使用&i32的地方使用,但这还不起作用(还没有?)对于泛型,std库开发人员还需要为以下组合(以及所有原语的组合)实现Add个特征:

  • &mut i32 + i32
  • i32 + &mut i32
  • &mut i32 + &mut i32
  • &mut i32 + &i32
  • &i32 + &mut i32

正如你所见,这可能会失控.我相信这会在future 消失.在此之前,请注意,以&mut i32结尾并试图在数学表达式中使用它是相当罕见的.

Rust相关问答推荐

有没有方法处理rust中嵌套的ok_or()?

有条件默认实现

trait声明中的生命周期参数

这个规则关于或模式到底是什么意思?如果表达片段的类型与p_i|q_i...&q;不一致,就会形成

当一个箱子有自己的依赖关系时,两个人如何克服S每箱1库+n箱的限制?

当T不执行Copy时,如何返回Arc Mutex T后面的值?

什么时候和为什么S最好是按值或引用传递简单类型

在我的Cargo 中,当我在建筑物中使用时,找不到我可以在产品包中使用的 crate .r我如何解决这个问题?

为什么&;mut buf[0..buf.len()]会触发一个可变/不可变的borrow 错误?

考虑到Rust不允许多个可变引用,类似PyTorch的自动区分如何在Rust中工作?

如何从宏调用闭包?

将引用移动到线程中

注释闭包参数强调使用高阶排定特征界限

(let b = MyBox(5 as *const u8); &b; ) 和 (let b = &MyBox(5 as *const u8); ) 之间有什么区别

如何将这些测试放在一个单独的文件中?

Rust 异步和 AsRef 未被发送

如何在 Rust 中返回通用 struct

`use std::error::Error` 声明中断编译

在 Rust 中组合特征的不同方法是否等效?

在 macro_rules 中转义 $ 美元符号