为什么我不能将 &&mut 转换为 && ?

vbs*_*stb 7 rust

此代码在 C++ 中编译:

int x = 5;
int *const px = &x;
int *const *const ppx = &px;
int const *const *const cppx = ppx;
Run Code Online (Sandbox Code Playgroud)

所以我尝试在 Rust 中做同样的事情:

let mut x: i32 = 5;
let px: &mut i32 = &mut x;
let ppx: &&mut i32 = &px;
let cppx: &&i32 = ppx;
Run Code Online (Sandbox Code Playgroud)

但是,这无法编译:

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`
Run Code Online (Sandbox Code Playgroud)

为什么不允许?

Aco*_*orn 2

\n

所以我尝试在 Rust 中做同样的事情:

\n
\n

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

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

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

    \n
  • \n
\n

它们很相似,在底层它们最终都是内存中的地址,但它们代表了提供不同保证的不同概念。

\n
\n

为什么不允许?

\n
\n

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

\n
let cppx: &&i32 = &&**ppx;\n
Run Code Online (Sandbox Code Playgroud)\n
\n

请参阅将 \xe2\x80\x9cmut\xe2\x80\x9d 放在变量名称之前和 \xe2\x80\x9c:\xe2\x80\x9d 之后有什么区别?https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html了解更多信息。Rust 也有指针类型:*const*mut

\n