为什么我无法将 &&mut 转换为 &&?

  • 本文关键字:mut 转换 rust
  • 更新时间 :
  • 英文 :


这段代码编译C++:

int x = 5;
int *const px = &x;
int *const *const ppx = &px;
int const *const *const cppx = ppx;

所以我尝试在 Rust 中做等效的操作:

let mut x: i32 = 5;
let px: &mut i32 = &mut x;
let ppx: &&mut i32 = &px;
let cppx: &&i32 = ppx;

但是,这无法编译:

error[E0308]: mismatched types
--> src/main.rs:5:23
|
5 |     let cppx: &&i32 = ppx;
|               -----   ^^^ types differ in mutability
|               |
|               expected due to this
|
= note: expected reference `&&i32`
found reference `&&mut i32`

为什么不允许?

所以我尝试在 Rust 中做等效的操作:

小心!C 指针和 C++ 引用不等同于 Rust 引用。

  • C 和 C++ 中的int const *x;是无法修改指向值的指针。它没有说明指针后面的实际值是否不可变:它不是指向不可变值的指针!将int *x转换为该只会限制指针可以执行的操作,因此允许在没有强制转换的情况下执行此操作。反之则不然。

  • Rust 中的&mut i32是一个可变引用。如果你有其中之一,那么 Rust 保证这是此时唯一可以访问该值的,并且值本身是可变的。要获得这样一个可变的引用,您必须在某个时候借用它。我们可以将其中一个转换为不可变的&i32因为我们知道我们是唯一的,所以有一个不可变的是不可变的。相反的情况是不允许的。

它们是相似的,在引擎盖下,它们最终成为内存中的一个地址,但它们代表了提供不同保证的不同概念。

为什么不允许?

是的,因为你正在从可变变为不可变,但你需要通过重新借用来明确:

let cppx: &&i32 = &&**ppx;

See 将">

mut"放在变量名之前和":"之后有什么区别?和 https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html 了解更多信息。Rust 也有指针类型:*const*mut

最新更新