注意:我使用的是g ++编译器(这是我听说的非常好,应该是非常接近标准)。当声明对Ints数组的引用时,为什么它必须是对const指针的引用?
比方说,你已经宣布的int数组:
int a[3] = { 4, 5, 6 };
现在让我们假设你真的要声明该数组(请不要介意,为什么,除了Bjarne的基准说,语言支持的话)。
案例1 - 如果你尝试:
int*& ra = a;
则编译梁木,并说:
"invalid initialization of non-const reference of type `int*&' from a temporary of type `int*'"
首先第一件事情,为什么是 '一个' 临时变量(即不它在内存中的地方吗?)......
反正精细,每当我看到一个非const的错误,我尝试在一个const扔...
案例2 - 如果你尝试:
int*const&rca = a; //wish I knew where the spaces should go (but my other post asking about this sort of protocol got a negative rank while many of the answers got ranked highly -- aha! there are stupid questions!)
然后一切都很酷,它编译,你会得到的数组的引用。
案例3 - 现在,这里是另一回事,这将编译:
int* justSomeIntPointer = a; //LINE 1
int*& rpa = justSomeIntPointer; //LINE 2
这也给了你原来的数组的引用。
所以这里是我的问题:什么时候静态声明的数组 的名称成为常量指针?我似乎记得一个int数组的名字也是一个int指针,但我不记得它曾经是一个const指针int ...
看起来好像情况1因为声明的参考(ra)不是const指针,这可能意味着'a'已经是一个const-pointer-to-int开头。
似乎情况2的工作原理是因为声明的引用(rca)已经是一个const-pointer-to-int。
案例3也有效,它很整洁,但为什么?假定的指针指向int(即数组名称'a')在什么时候成为一个常量指针?将它分配给int *(LINE 1)时会发生吗?或者当您将该int *分配给int * &(LINE 2)时它会发生吗?
希望这是有道理的。谢谢。
所以被临时变量总是const的? – Jimmy
@Jimmy:临时表达式并不总是const,但是语言禁止直接绑定到非const引用。数组'a'不是一个临时的,但它是由数组到指针的转换产生的指针,这是一个临时的。 –
在堆栈中声明意味着'具有自动存储持续时间',即当其包含的块/对象确实不在“临时”时超出范围。很少有人考虑必须手动管理动态分配的对象才能成为加分点。我们需要的最后一件事是关于为什么动态分配更好的另一个错误想法。这一点尤其糟糕,因为它引发了_temporary_的错误定义,这个术语具有非常明确的,不同的含义。 –