I think that’s the reason, kind of. But actually the only similarity between Rust references and C++ references is that they are non-null and always point to a valid object. On all the other aspects, Rust references work as C++ pointers, while the C++ references are actually lvalues exposed in the type system (Rust, of course, also has lvalues, but you can’t really express them as temporaries). Eg. you can do this with Rust refs and not with C++ ones:
let mut r: &i32 = &x;
r = &y;
The only other place I recall that does automatic dereferencing are “deref-coercions”. If the expression you have to write looks like that: &*****foo, you can just write &foo, ie. compiler would insert appropriate number of * for you (eg. for going from &&Vec<T> to &[T]). NB the star works both for simple deref (going from &T to T) and for custom Deref.
And why autoderef only in these two places? Probably to get most common and obvious cases work smoothly, while leaving the rest explicit and keep the language simple.
There are also some places that look like they do autoderef, but they’re not, eg.:
let a = 2 + &5; // It works because `i32` implements `Add<&i32>`
println!("{}", &&42); // It works because `Display` implementation for `&T`
// just calls implementation for `T`.