I think part of this confusion is historical. Once upon a time, Rust was a different language that did not a general mechanism for dynamically-sized types. [T] could not exist on its own. &[T] and &mut [T] were special cases in the language, called (mutable) slice. And there was probably a point where Box<[T]> did not exist (I don’t remember exactly).
Then DST came along and generalized things. SomeTrait (used as a type) and [T] are now both valid types of their own (though you can not have values of these types directly on the stack). Separately, &U, &mut U, Box<U>, and others are generalized so that they support any U, even dynamically sized. So &[T] is not a special case in the language anymore, it’s two concepts [T] and &U used together with U = [T].
I don’t know if it’s been done formally, but one way to retrofit the terminology for this new world is:
-
[T] is a slice.
-
&[T] is a shared reference to a slice, but is usually called a slice for short. It’s ambiguous, but [T] can rarely be used on its own anyway so context usually clarifies.
-
&mut [T] is a mutable reference to a slice (though I prefer to call &mut U exclusive reference), usually called mutable slice for short.
-
Box<[T]> is a boxed slice. (It’s rarely used in practice, since Vec<T> is more convenient and often works just as well.)