Примечание: я использую компилятор g ++ (который, как я слышал, довольно хорош и должен быть довольно близок к стандарту).
Допустим, вы объявили массив целых:
int a[3] = { 4, 5, 6 };
Теперь предположим, что вы действительно хотите объявить ссылку на этот массив (не говоря уже о том, почему, кроме Бьярне, язык поддерживает это).
Случай 1 - Если вы попробуете:
int*& ra = a;
затем компилятор останавливается и говорит:
"invalid initialization of non-const reference of type `int*&' from a temporary of type `int*'"
Прежде всего, почему 'a' - временная переменная (т. Е. Ей не место в памяти?)...
В любом случае, хорошо, когда я вижу неконстантную ошибку, я пытаюсь добавить констант ...
Случай 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
Это также дает вам ссылку на исходный массив.
Итак, вот мой вопрос: в какой момент имя статически объявленного массивастать const-указателем?Кажется, я помню, что имя массива int также указатель на int, но я не помню, чтобы он когда-либо был const-pointer-to-int ...
Кажется,Случай 1 завершается неудачно, потому что объявленная ссылка (ra) не относится к const-указателю, что может означать, что 'a' уже было const-pointer-to-int-int для начала.
Это похоже на случай 2работает, потому что объявленная ссылка (rca) уже является const-pointer-to-int.
Случай 3 также работает, что неплохо, но почему?В какой момент предполагаемый указатель на int (т. Е. Имя массива 'a') становится const-указателем?Это происходит, когда вы присваиваете ему int * (LINE 1), или это происходит, когда вы присваиваете это int * int * & (LINE 2)?
Надеюсь, это имеет смысл.Спасибо.