2
#include <iostream>

using namespace std;
int main(void)
{
    int num[5];
    const int* &ref = num;

    return 0;
}

参照変数が以下を参照しているかどうかについて言及したC++の本を読みました。

  1. タイプは異なりますが、変換できる変数。
  2. 左辺値ではない変数。

参照変数がとして宣言されている限りconst、上記の2つのケースは、コンパイラがストレージを作成し、参照変数の識別子がその識別子として扱われる間に値が格納されるメソッドを使用して解決されます。特定の保管場所。以下はデモコードです。

ケース1
#include <iostream>

using namespace std;
int main(void)
{
    int num = 5;
    const long long &ref = num; //the value 5 is place in a new storage where ref is the identifier

    return 0;
}
ケース2:
#include <iostream>

using namespace std;
int main(void)
{
    int num = 5;
    const int &ref = num + 1; //expression num + 1 evaluated and store in new storage with identifier ref

    return 0;
}

この2つのケースは有効ですが、コード内のケースが無効になるのはなぜですか?

私の論理は、使用時に配列の名前が配列の最初の要素へのポインタに変換されるためです。したがって、コンパイラはこれが左辺値ではないことを認識し、そのアドレスを格納するための新しいストレージが作成されます。もちろん、参照変数名はその場所の識別子として使用されます。

:これは少し話題から外れていることは知っていますが、配列名が左辺値であるかどうかはわかりますか?int &ref = numコードをに変更すると、左辺値ではないと思いますが、さらに確認する必要があるため、単純な「はい」または「いいえ」で十分です。

ありがとうございました。

4

1 に答える 1

4

参照変数はconstとして宣言されていません。

との間には違いがconst int *ありint * const、間違ったものを選択しました。

あなたの例(ii)は同じ理由で無効です、それはconst int &ref = num + 1;

ご注意ください。単純な「はい」または「いいえ」でうまくいくかどうかはわかりません。単純な配列名、配列を参照する左辺値です。ただし、ほとんどのコンテキストでは、右辺値ポインターである最初の要素へのポインターに減衰します。

于 2012-07-25T07:09:45.237 に答える