Примечание. Я использую компилятор g++ (который я слышу довольно хорошо и должен быть довольно близок к стандарту).
Скажем, вы объявили массив ints:
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*'"
Прежде всего, почему "a" является временной переменной (т.е. не имеет ли место в памяти?)...
В любом случае, отлично, всякий раз, когда я вижу несогласованную ошибку, я пытаюсь вставить 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
Это также дает ссылку на исходный массив.
Итак, вот мой вопрос: в какой точке имя статически объявленного массива стать const-указателем? Кажется, я помню, что имя массива ints также является указателем на int, но я не помню, чтобы он всегда был const-pointer-to-int...
Кажется, что Case 1 терпит неудачу, потому что ссылка объявлена (ra) не на const-указатель, что может означать, что "a" уже был const-pointer-to-int для начала.
Кажется, что Case 2 работает, потому что ссылка объявлена (rca) уже является const-указателем на int.
Дело 3 также работает, что является опрятным, но почему? В какой момент предполагаемый указатель-на-int (т.е. Имя массива 'a') становится константным указателем? Это происходит, когда вы назначаете его int * (LINE 1), или это происходит, когда вы присваиваете этому int * int * & (LINE 2)?
Надеюсь, это имеет смысл. Спасибо.