2011-09-13 36 views
8

以下では、const参照が非constオブジェクトに使用される前に一時オブジェクトが作成されますか?非constオブジェクトへのconst参照

const int y = 2000; 
const int &s = y // ok, const reference to const object. 

int x = 1000; 
const int &r = x; // any temporary copy here? 

この場合、どのように動作しますか?

const int z = 3000; 
    int &t = z // ok, why can't you do this? 

答えて

13

参照は、単に既存のオブジェクトの別名です。 constはコンパイラによって強制されます。参照番号rを使用してオブジェクトを変更しようとしていないことを単純にチェックします。 *これは、コピーを作成する必要はありません。

constは、「読み取り専用」を強制するためのコンパイラの指示にすぎないので、最後の例がコンパイルされない理由はすぐに明らかになります。 constは、constの参照をconstというオブジェクトに置き換えることによって、それを邪魔することができれば無意味になります。

*もちろん、xでオブジェクトを自由に変更できます。変更は同じオブジェクトを参照するため、rで表示されます。

+1

を述べた最初のケ​​ースのようにする必要があり、r' 'の値を変更することができ、 'const'。 – avakar

+0

通常、コンパイラは単純なポインタで参照を実装します。 –

+1

@quant_dev OPのサンプルでは、​​ 'x'を記述するソースコードと' r'を記述するソースコードは同じマシンコードにコンパイルされます。ポインタは関与していません(見たすべてのコンパイラで)。それはとにかく関連しているわけではありません。 – Cubbi

5

int x = 1000; 
const int &r = x; 

の右側は左辺xのタイプ(CV-資格を無視して)基準のタイプと同じです。このような状況では、参照は直接xに添付されます。一時的なものは作成されません。

「どのように動作しますか」...あなたの質問を促した内容は分かりません。これはちょうど最も厳しい方法で動作します。参照はxに直接添付されています。それ以上のことはありません。それはすぐのconst正しさのルールに違反しているため

あなたは

const int z = 3000; 
int &t = z; 

を行うことはできません。

+2

+1両方の部分に答える – Lou

1

リファレンス(&)の理解は、この質問に答える..

リファレンスは、それがそれに割り当てられていることを変数にだけエイリアス..

され、constのは、コンパイラによって課せられた制約でありますconstとして宣言されている変数へ

int x = 1000; 
const int &r = x; 

この場合、const変数ではないconst参照。だからあなたは...(ただ読み取り専用機能)参照変数Rとxのデータを変更することはできません、まだあなたはまだこの場合、constメンバに、非constの参照をX

const int z = 3000; 
int &t = z 

を変更することで、データxを変更することができました無意味です。あなたは参照がconstメンバーを編集できるようにすることができます(これは決して不可能です)。それが宣言されていても

あなたはconstメンバのための参照を作成したいのであれば、それはあなたが特に

const int z = 3000; 
const int &t = z; 
関連する問題