为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
一只萌萌小番薯 2019-08-26 11:09:00
为什么引用数组是非法的?以下代码无法编译。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 &模拟引用数组。
查看完整描述

3 回答

?
繁星淼淼

TA贡献1775条经验 获得超11个赞

回答关于标准的问题我可以引用C ++标准§8.3.2/ 4

不应引用引用,不引用引用数组也不引用引用指针。


查看完整回答
反对 回复 2019-08-26
?
温温酱

TA贡献1752条经验 获得超4个赞

我相信答案很简单,它与引用的语义规则以及如何在C ++中处理数组有关。

简而言之:引用可以被认为是没有默认构造函数的结构,因此适用所有相同的规则。

1)从语义上讲,引用没有默认值。只能通过引用某些内容来创建引用。引用没有值来表示缺少引用。

2)当分配大小为X的数组时,程序会创建一个默认初始化对象的集合。由于引用没有默认值,因此创建此类数组在语义上是非法的。

此规则也适用于没有默认构造函数的结构/类。以下代码示例无法编译:

struct Object{
    Object(int value) { }};Object objects[1]; // Error: no appropriate default constructor available


查看完整回答
反对 回复 2019-08-26
?
GCT1015

TA贡献1827条经验 获得超4个赞

鉴于int& arr[] = {a,b,c,8};,是什么sizeof(*arr)

在任何其他地方,引用被视为仅仅是事物本身,所以sizeof(*arr)应该简单地说sizeof(int)。但这会使这个数组上的数组指针算术运算错误(假设引用的宽度不同于整数)。为消除歧义,这是禁止的。


查看完整回答
反对 回复 2019-08-26
  • 3 回答
  • 0 关注
  • 815 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信