此代码在 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)
为什么不允许?
\n\n所以我尝试在 Rust 中做同样的事情:
\n
小心!C 指针和 C++ 引用并不等同于 Rust 引用。
\nint const *x;在C和C++中是一个不能修改指向值的指针。它没有说明指针后面的实际值是否是不可变的:它不是指向不可变值的指针!将 an 转换int *x为该指针只会限制指针可以执行的操作,因此无需强制转换即可允许。相反的情况则不然。
&mut i32Rust 中是可变引用。如果您有其中之一,那么 Rust 保证这是此时唯一可以访问该值的值,并且该值本身是可变的。为了获得这样一个可变的引用,你必须在某个时候借用它。我们可以将其中之一转换为不可变的,&i32因为我们知道我们是唯一的,所以拥有一个不可变的是可以的。相反的情况是不允许的。
它们很相似,在底层它们最终都是内存中的地址,但它们代表了提供不同保证的不同概念。
\n\n\n为什么不允许?
\n
是的,因为您将从可变变为不可变,但您需要通过重新借用来明确:
\nlet cppx: &&i32 = &&**ppx;\nRun Code Online (Sandbox Code Playgroud)\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。
| 归档时间: |
|
| 查看次数: |
91 次 |
| 最近记录: |