为什么引用数组是非法的?以下代码无法编译。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贡献1752条经验 获得超4个赞
我相信答案很简单,它与引用的语义规则以及如何在C ++中处理数组有关。
简而言之:引用可以被认为是没有默认构造函数的结构,因此适用所有相同的规则。
1)从语义上讲,引用没有默认值。只能通过引用某些内容来创建引用。引用没有值来表示缺少引用。
2)当分配大小为X的数组时,程序会创建一个默认初始化对象的集合。由于引用没有默认值,因此创建此类数组在语义上是非法的。
此规则也适用于没有默认构造函数的结构/类。以下代码示例无法编译:
struct Object{ Object(int value) { }};Object objects[1]; // Error: no appropriate default constructor available
GCT1015
TA贡献1827条经验 获得超4个赞
鉴于int& arr[] = {a,b,c,8};
,是什么sizeof(*arr)
?
在任何其他地方,引用被视为仅仅是事物本身,所以sizeof(*arr)
应该简单地说sizeof(int)
。但这会使这个数组上的数组指针算术运算错误(假设引用的宽度不同于整数)。为消除歧义,这是禁止的。
- 3 回答
- 0 关注
- 815 浏览
添加回答
举报
0/150
提交
取消