2
#include <iostream>

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

    return 0;
}

我读过一本 C++ 书,其中提到引用变量是否引用:

  1. 类型不同但可以转换的变量。
  2. 不是左值的变量。

只要引用变量声明为const,上述两种情况将通过使用编译器将创建存储并将值放入其中而引用变量的标识符被视为该标识符的方法来解决特定的存储位置。下面是演示代码。

情况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;
}
案例二:
#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个case是有效的,那The Code:里面的case怎么是无效的呢?

我的逻辑是因为使用时数组的名称将被转换为指向数组第一个元素的指针,因此编译器应该已经发现这不是左值,并且将创建一个新的存储来存储该地址以及当然,引用变量名将作为该位置的标识符。

注意:我知道这有点离题,但我可以知道数组名称是否为 Lvalue 吗?只需一个简单的 yes 或 no 即可,因为将代码更改为int &ref = num我认为它不是 lvalue ,但我只需要进一步确认。

谢谢你。

4

1 回答 1

4

您的引用变量声明为 const。

const int *和之间有区别int * const,你选错了。

您的示例(ii)出于同样的原因无效,应该是const int &ref = num + 1;

对于您的说明,我不确定简单的是或否会起作用。一个简单的数组名一个左值,指的是数组。但是,在大多数情况下,它会衰减为指向第一个元素的指针,这是一个右值指针。

于 2012-07-25T07:09:45.237 回答