10

コンパイルにcharaを割り当てると、コンパイルエラーが発生することに気付きました。const int&int&

char c;
int& x = c;    // this fails to compile
const int& y = c;    // this is ok

これを行うのは良い習慣ではないことは理解していますが、それが発生する理由を知りたいと思います。

「異なるタイプの参照への割り当て」、「int参照へのcharの割り当て」、「const参照とnon-const参照の違い」を探して答えを検索し、多くの有用な投稿(int vs const int&、 int変数にcharを割り当てるときの奇妙な動作、CおよびC ++でcharをintに変換関数パラメーターとしての参照とconst参照の違い?)、しかし、それらは私の質問に対処していないようです。

これが以前にすでに答えられているならば、私の謝罪。

4

3 に答える 3

8
int& x = c;

charここでは、からへの暗黙の変換intがコンパイラによって実行されています。結果の一時intは、参照にのみバインドできconstます。aにバインドするconst int&と、一時結果の有効期間が延長され、バインド先の参照の有効期間と一致します。

于 2012-12-08T18:23:28.320 に答える
3

この動作は、 8.5.3/p5.2リファレンス[dcl.init.ref]の標準N4527で正当化されます。

5タイプ「cv1T1」への参照は、タイプ「cv2T2」の式によって次のように初期化されます。

..。

5.2それ以外の場合、参照は不揮発性constタイプへの左辺値参照(つまり、cv1はconst)であるか、参照は右辺値参照である必要があります。[ 例:

double& rd2 = 2.0; // error: not an lvalue and reference not const
int i = 2;
double& rd3 = i; // error: type mismatch and reference not const

—終了例]

于 2015-12-04T17:16:57.163 に答える
1

その線が

const int& y = c; 

一時を作成し、一時にyバインドすることは、次の方法で確認できます。

#include <iostream>

int main()
{
   char c = 10;
   const int& y = c;

   std::cout << (int)c << std::endl;
   std::cout << y << std::endl;

   c = 20;

   std::cout << (int)c << std::endl;
   std::cout << y << std::endl;

   return 0;
}

出力:

10
10
20
10

の値をy変更しても、の値は変更されませんでしたc

于 2015-12-04T17:18:34.320 に答える