-2

次の点を考慮してください。

int ival = 1.01;
int &rval = 1.01; // error: non-const reference to a const value.
int &rval = ival;

rval = 1.01;

リテラル値への &rval の最初の割り当ては、期待どおりに失敗します。その行をコメントアウトすると、コードがコンパイルされて実行されます。初期化が失敗する理由は理解できますが、最後の行で rval への割り当てが機能する理由がわかりません。リテラル値への参照を割り当てることが許可されているとは思いませんでした。

編集:素早い回答ありがとうございます。恥ずかしさを隠すためにこれを削除したくなりましたが、他の人が指差して笑えるようにここに残しておきます.

私自身の弁明として、私は本 (C++ Primer) の演習に取り組んでおり、この問題は参照の初期化に関するものです。それでも、そもそも参照のポイントを完全に見落としていたのはかなり恥ずかしいことです。:)

4

3 に答える 3

6

ivalはリテラル値ではなく、リテラル1.01値です。コピーされivalた変数は、別の変数に割り当てられた参照を持つことが最も確実です。

于 2009-01-11T02:35:27.073 に答える
6

参照が初期化されると、初期化されたもののエイリアスになります。参照が初期化されると、参照が参照するものを変更することはできません。ただし、参照が参照する「もの」は変更できます (参照が でない場合const)。

最後の行では、変数ivalを 1.01 に設定しています (再び)。

于 2009-01-11T02:35:41.457 に答える
4

ただし、次のことができることに驚くかもしれません。

const int& x = 42;        // No error!

C++ では、const参照をリテラル値 (または他の右辺値) で初期化できます。実際に起こることは、コンパイラが RHS をコピーして一時を作成し、参照を初期化してその一時を参照することです。コンパイラは、スコープが終了するまで (つまりx、この場合はスコープから外れるたびに) 一時ファイルが存続することを保証します。

これは、クラスのメンバー変数を初期化するときには機能しないことに注意してください。

トリッキーでしょ?:)

于 2009-01-11T04:56:48.817 に答える