One of the most confounding problems on this topic is how heavily overloaded the word "reference" has become.
Another vexatious concept is the idea of "aliases" in which two (or more) names within the same scope can refer to the same storage.
Not only is it highly questionable why such same-scope aliasing would be necessary, but many explanations of it do not even attempt to reconcile it with the concept of pointer indirection.
In my view, a reference is a one-level pointer with implied address-taking and dereferencing. It is not an "alias" for storage at all. One name (declared in the standard way) is the "direct" name for the storage - any others (declared as references) are indirect pointers to the storage, not aliases.
The syntactic equivalence between direct access and referential access - an equivalence of appearances which is by design - does not mean the syntax is causing identical computational operations to occur in each case.
What makes this so dreadful in C++, is that references are a retrofit to a language that already had, and continues to have side-by-side, the more general (and more explicit) pointer syntax. The result is conceptually discordant - I presume it was supplied to ease certain programming workloads, where there would be limited or no mixed use of references and pointers together.
What is even worse is that many explanations I've seen do not describe "references" as a special kind of pointer. Instead they attempt to introduce a second conceptual layer of indirection between the names and the storage - this notion of "aliasing" - which is distinct from the layer of indirection provided by pointers.
This defies what appears to me to be a tenet of programming languages, which is that a declared name refers uniquely and immutably to a particular unit of storage. Any exceptions to this will prove the rule.
So in my view, this "aliasing" that some authors refer to does not in fact exist. It is merely a consequence of their own muddled understanding, which they spread to others in turn, hence our confusion about the matter.
Final point, the fact that the compiler, as an optimisation, may eliminate pointers by treating references as aliases, does not make the aliasing concept real within the programming language itself.