为什么引用数组是非法的?

为什么引用数组是非法的?

以下代码无法编译。

int a = 1, b = 2, c = 3;int& arr[] = {a,b,c,8};

C ++标准对此有何看法?

我知道我可以声明一个包含引用的类,然后创建该类的数组,如下所示。但我真的想知道为什么上面的代码不能编译。

struct cintref{
    cintref(const int & ref) : ref(ref) {}
    operator const int &() { return ref; }private:
    const int & ref;
    void operator=(const cintref &);};int main() {
  int a=1,b=2,c=3;
  //typedef const int &  cintref;
  cintref arr[] = {a,b,c,8};}

可以使用struct cintref而不是const int &模拟引用数组。


一只萌萌小番薯
浏览 747回答 3
3回答

繁星淼淼

回答关于标准的问题我可以引用C ++标准§8.3.2/ 4:不应引用引用,不引用引用数组,也不引用引用指针。

温温酱

我相信答案很简单,它与引用的语义规则以及如何在C ++中处理数组有关。简而言之:引用可以被认为是没有默认构造函数的结构,因此适用所有相同的规则。1)从语义上讲,引用没有默认值。只能通过引用某些内容来创建引用。引用没有值来表示缺少引用。2)当分配大小为X的数组时,程序会创建一个默认初始化对象的集合。由于引用没有默认值,因此创建此类数组在语义上是非法的。此规则也适用于没有默认构造函数的结构/类。以下代码示例无法编译:struct Object{     Object(int value) { }};Object objects[1]; // Error: no appropriate default constructor available

GCT1015

鉴于int& arr[] = {a,b,c,8};,是什么sizeof(*arr)?在任何其他地方,引用被视为仅仅是事物本身,所以sizeof(*arr)应该简单地说sizeof(int)。但这会使这个数组上的数组指针算术运算错误(假设引用的宽度不同于整数)。为消除歧义,这是禁止的。
打开App,查看更多内容
随时随地看视频慕课网APP