Having said that: I'm proof that you can get a bunch of stuff done in Rust without having a perfect mental model of this stuff. :)
Having said that: I'm proof that you can get a bunch of stuff done in Rust without having a perfect mental model of this stuff. :)
Having &shared plastered all over your code base would be ... suboptimal.
Not everything in a language needs to be 100% self descriptive.
I think the designers arrived at a good tradeoff.
fn box_immut(x: Box<i32>) {
// illegal
*x += 1;
}
fn ref_immut(x: &mut i32) {
// legal
*x += 1;
}
IIRC under the current current Rust-to-LLVM compilation rules, &mut T is noalias (because it's exclusive), and &T is noalias or readonly or something (because all other &T are immutable) unless T contains an UnsafeCell. It actually took many years to get &mut T to be noalias without exposing LLVM bugs resulting in miscompiled Rust (which went undiscovered because Rust is the first LLVM language to use noalias so heavily).And noalias and pointer aliasing is a huge mess, with crates like owning_ref and Tokio's intrusive linked lists and Pin<Box<T>> being unsound under the proposed Stacked Borrows rules. And I just found a LLVM codegen soundness issue: https://github.com/rust-lang/rust/issues/63787.
The "mut" keyword is not the opposite of "const" from C++. It's declaring that you have exclusive (unique) ownership at this moment.
1. Rejected unsafe programs (and the why)
2. Rejected safe programs (and the why)
.. and try to convince yourself that you understand the logic behind the two.
https://whileydave.com/2021/12/06/modelling-borrow-checking-...
https://github.com/rust-lang/unsafe-code-guidelines/blob/mas...
That's one of the best features, IMO. If you tried approaching C or even C++ with that mentality, you're going to hit brick walls, hidden errors and antipatterns before you know it. If you try it in Rust, you're going to get a couple linting errors and and a non-functional build. Not a perfect catch-all for every error you can cause, but like you suggested, it's plenty to get stuff done with.