既存の参照をC ++のリテラル値に割り当てることができるのはなぜですか?
-
08-07-2019 - |
質問
次のことを考慮してください:
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 ++入門)の演習を行っていますが、この問題は参照初期化に関するものです。それでも、そもそも参照のポイントを完全に見落としているのはかなり恥ずかしいことです。 :)
解決
ival
はリテラル値ではなく、 1.01
はリテラル値です。変数である ival
にコピーされており、別の変数に参照を割り当てることができます。
他のヒント
参照が初期化された後、それは初期化されたもののエイリアスです。参照が初期化されると、参照が参照するものを変更することはできません。ただし、参照が参照する「もの」を変更できます(参照が const
でない場合)。
最後の行は、変数 ival
を1.01(再び)に設定しています。
ただし、できることができることに驚くかもしれません:
const int& x = 42; // No error!
C ++では、リテラル値(または他の右辺値)を使用して const 参照を初期化できます。実際に起こることは、コンパイラがRHSをコピーして一時を作成し、その一時を参照する参照を初期化することです。コンパイラーは、スコープが終了するまで(つまり、この場合 x
がスコープから出るたびに)一時ファイルが存続するようにします。
クラスのメンバー変数を初期化するとき、これは機能しないことに注意してください。
トリッキーなの? :)