2015-03-17 2 views
-1

Я учусь C++, и мой учебник (C++ праймер) предлагает следующий пример:возвращает ссылку на массив против указателя на массив

int odd[] = {1,3,5,7,9}; 
int even[] = {0,2,4,6,8}; 
// returns a pointer to an array of five int elements 
auto arrPtr(int i) -> int(*)[5] 
{ return (i%2) ? &odd : &even;} 

и как exerices требующего, чтобы изменить функцию так, чтобы он возвращает ссылку на массив:

auto arrPtr(int i) -> int(&)[5] 
{ return (i%2) ? odd : even;} 

то, что я не понимаю, почему вы должны вернуть объект массива, чтобы преобразовать его в ссылку на этот массив (если я понять код правильно). Не должен ли адрес памяти массива «идеально соответствовать» в ссылочном типе?

+0

Нет, ссылка не является адресом. Это псевдоним для существующего объекта. – juanchopanza

+2

Поскольку ссылка на T инициализируется с использованием объекта типа T, а не указателя на T. – user657267

+0

Просто добавьте это: 'template operator T & (T * j) {return * j; } '(Шутки. На самом деле этого не делаете.) –

ответ

1

Я не понимаю, почему вы должны вернуть объект массива, чтобы преобразовать его в ссылку на этот массив (если я правильно понимаю код).

Так как вы инициализируете ссылку: указав объект, на который он ссылается, без дополнительных украшений. Указатели инициализируются из других указателей, поэтому вам нужно & принять адрес объекта, указав указатель.

Не должен ли адрес памяти массива «соответствовать» идеально в ссылочном типе?

Да, ссылки обычно реализуются так же, как указатели. Но почему это должно повлиять на их синтаксис? Это концептуально разные вещи (альтернативное имя для объекта, а не значение, содержащее адрес) с различным синтаксисом.

+0

Точно: указатель - это не то, что ссылка __is__, а только то, что он (обычно) сделал (перефразируя CS Lewis). – AAT