参照はコンパイル時にポインタに変換されるので
int* ref(void)
{
//
return(&x);
}
に等価です。

> ref()=5
*ref()=5

> X&X::operator=(constX&)」
X* X::operator=(const X*)

X を返すか X& を返すかの違いは値を返すかポインタを返すかの違い。