C++の参照渡しについての質問です。

以下のようなメンバ関数があったとします。
SStruct GetReturnStruct() const;
INT32 GetReturnINT() const;

これらの関数を以下のように使用します。

1. SStruct sStruct = GetReturnStruct();
2. INT32 nINT = GetReturnINT();
3. SStruct& sTestStruct = GetReturnStruct();
4. INT32& nTestINT = GetReturnINT();
5. const SStruct& c_nTestStruct = GetReturnStruct();
6. const INT32& c_nTestINT = GetReturnINT();

実行環境はVisualStudio2005です。
1と2は普通にコンパイルして実行できるのですが、
3と4の場合、3はコンパイルが通り、4はエラーメッセージ
「'INT32' から 'INT32 &' に変換できません。」
が出てしまいました。
また、5と6ではコンパイルが通りました。

1から6までは内容的には同じ値が入ると思うのですが、
内部的な処理はそれぞれどのようになされているのでしょうか?

構造体などを使うときはなるべく参照かポインタを引数にしたほうがよい
と聞いたのですが、参照の使い方がまだ今ひとつ理解できていません。

どのような場合に参照渡しをしたほうがよいのでしょうか?