#include <iostream>
using namespace std;
int main(void)
{
int num[5];
const int* &ref = num;
return 0;
}
参照変数が以下を参照しているかどうかについて言及したC++の本を読みました。
- タイプは異なりますが、変換できる変数。
- 左辺値ではない変数。
参照変数がとして宣言されている限りconst
、上記の2つのケースは、コンパイラがストレージを作成し、参照変数の識別子がその識別子として扱われる間に値が格納されるメソッドを使用して解決されます。特定の保管場所。以下はデモコードです。
#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
コードをに変更すると、左辺値ではないと思いますが、さらに確認する必要があるため、単純な「はい」または「いいえ」で十分です。
ありがとうございました。