C++の参照は再初期化できない

ある関数の戻り値がクラス参照となっていて、それを何度か呼び出す場合、別名で何個も作るのが面倒で、思わず使いまわした場合。コンパイルは通るが大変なことに。


class CTest {
public:
int m_nValue;
};

CTest g_x[2];

CTest& getX(int n)
{
return g_x[n];
}

int _tmain(int argc, _TCHAR* argv[])
{
// g_xの初期化
for(int i=0; i<2 ;i++)
g_x[i].m_nValue = i;

// xをgetX(0)で初期化
CTest& x = getX(0);
// xをgetX(1)で再初期化
x = getX(1);
// ↑NG:コンパイルは通るが、実際には再初期化ではなくgetX(0)へのコピーが発生している。

printf("x = %d\n", x.m_nValue);
printf("g_x[0] = %d\n", g_x[0].m_nValue);
printf("g_x[0] = %d\n", g_x[0].m_nValue);
return 0;
}

実行結果


x = 1
g_x[0] = 1
g_x[1] = 1

JIS X3014にもこう書かれています。
「参照は、初期化した後で他のオブジェクトを参照するように変更することはできない。」

大事なことなのでもう一度書きます。
C++の参照は再初期化できない」