10

コードスニペットに出くわしました

const int& reference_to_const_int = 20;
cout<<"\n  reference_to_const_int = "<<reference_to_const_int<<endl;     

このコードはコンパイルされ、出力とともに実行されます:-

reference_to_const_int = 20

これは私にとって奇妙なことです。私が知っているように、参照はメモリを占有せず、他の変数のエイリアスです。したがって、私たちは言うことができません

int& reference_to_int = 30;

上記のステートメントはコンパイルせず、エラーが発生します:-

 error: invalid initialization of non-const reference of type ‘int&’ from an rvalue of type ‘int’

「constint&」の場合、正確には何が起こっているのでしょうか。完全な説明が望まれます。

親切に助けてください。

ありがとう

4

2 に答える 2

11

一時的なものが作成され、それへのconst参照をバインドすることは合法ですが、非一時的なものにバインドすることは違法constです。

それは次のようなものです:

const int& reference_to_const_int = int(20);  //LEGAL
      int& reference_to_const_int = int(20);  //ILLEGAL

参照は一時的なものの寿命を延ばします、それconstがこれが機能する理由です。それは言語のルールにすぎません。

于 2012-05-29T15:13:29.140 に答える
5

この動作は、参照を一時オブジェクトにバインドしたときに何が起こるかを見ると理解しやすくなります。私たちが書くなら

const int& reference_to_const_int = 20; //A temporay object int(20) is created.

コンパイラは上記のコードを次のように変換します。

int temp = 20;
const int& reference_to_const_int = temp;

reference_to_const_intがconstでない場合は、reference_to_const_intに新しい値を割り当てることができます。そうすることで、リテラル20は変更されませんが、代わりに一時オブジェクトであるためアクセスできないtempが変更されます。const参照は読み取り専用であるため、一時参照を必要とする値にconst参照のみをバインドできるようにすると、問題が完全に回避されます。

C ++でconst参照が一時オブジェクトまたはRVALUES(リテラルなど)を受け入れることができるのはなぜですか?

参照が表示される最も一般的な場所は、関数の引数または戻り値です。参照が関数の引数として使用される場合、関数内の参照を変更すると、関数外の引数も変更されます。

関数が一時オブジェクトまたはリテラルを入力として期待/受け入れることができ、関数がオブジェクトの定数を尊重する場合、引数をconst参照にすると、関数をすべての状況で使用できるようになります。

一時オブジェクトは常にconstであるため、const参照を使用しない場合、その引数はコンパイラーによって受け入れられません。

void f(int&) {}
void g(const int&) {}
int main() 
{
    //f(1); //Error
    g(1); //OK 
}
于 2012-10-03T15:39:58.177 に答える