Well, if you pass an object
by reference into function, and if we assume that the function call does
not get inlined, then somehow the reference needs to be
stored, so that the function being called can pick it up – either on the stack or in a register (depending on how the "calling convention" passes the parameter). And what gets stored there is nothing but the
address of the object! So I think we can say that,
technically, references are implemented just like pointers – they pass the
address of the object rather than a "copy" of that object.
Sure,
within a function, or if the function call gets inlined, there is
no need to actually "store" the reference (i.e. address of the object) anywhere, because we can simply access the referenced object "directly"; the reference then acts as an "alias" for the object. But the same would be true when working with pointers, I believe.
See also:
https://stackoverflow.com/a/3954803/19369426