答えが満足のいくものではないので、2セント追加します。
次のケースを分析してみましょう。
誤った使い方
int& getInt()
{
int x = 4;
return x;
}
これは明らかにエラーです
int& x = getInt(); // will refer to garbage
静的変数での使用
int& getInt()
{
static int x = 4;
return x;
}
静的変数はプログラムの存続期間を通じて存在するため、これは正しいです。
int& x = getInt(); // valid reference, x = 4
これは、シングルトンパターンを実装する場合にも非常に一般的です
Class Singleton
{
public:
static Singleton& instance()
{
static Singleton instance;
return instance;
};
void printHello()
{
printf("Hello");
};
}
使用法:
Singleton& my_sing = Singleton::instance(); // Valid Singleton instance
my_sing.printHello(); // "Hello"
オペレーター
標準ライブラリコンテナは、たとえば、参照を返す演算子の使用に大きく依存します。
T & operator*();
以下で使用できます
std::vector<int> x = {1, 2, 3}; // create vector with 3 elements
std::vector<int>::iterator iter = x.begin(); // iterator points to first element (1)
*iter = 2; // modify first element, x = {2, 2, 3} now
内部データへの迅速なアクセス
内部データにすばやくアクセスするために&が使用される場合があります
Class Container
{
private:
std::vector<int> m_data;
public:
std::vector<int>& data()
{
return m_data;
}
}
使用法:
Container cont;
cont.data().push_back(1); // appends element to std::vector<int>
cont.data()[0] // 1
ただし、これは次のような落とし穴につながる可能性があります。
Container* cont = new Container;
std::vector<int>& cont_data = cont->data();
cont_data.push_back(1);
delete cont; // This is bad, because we still have a dangling reference to its internal data!
cont_data[0]; // dangling reference!