Взять адрес элемента массива «один за другим» через индекс: допустимый по стандарту C ++ или нет? - PullRequest
72 голосов
/ 12 июня 2009

Я уже несколько раз утверждал, что следующий код не разрешен стандартом C ++:

int array[5];
int *array_begin = &array[0];
int *array_end = &array[5];

Является ли &array[5] допустимым кодом C ++ в этом контексте?

Я бы хотел получить ответ со ссылкой на стандарт, если это возможно.

Было бы также интересно узнать, соответствует ли он стандарту С. И если это не стандартный C ++, почему было принято решение рассматривать его иначе, чем array + 5 или &array[4] + 1?

Ответы [ 13 ]

0 голосов
/ 15 июня 2009

Это совершенно законно.

Класс шаблона vector <> из stl делает именно это при вызове myVec.end (): он получает указатель (здесь как итератор), который указывает один элемент за концом массива.

0 голосов
/ 13 июня 2009

C ++ стандарт, 5.19, параграф 4:

Выражение константы адреса - это указатель на lvalue .... Указатель должен быть создан в явном виде, используя унарный оператор & ... или используя выражение типа array (4.2) .... Оператор подписки [] ... может использоваться при создании выражения константы адреса, но при использовании этих операторов значение объекта не должно быть доступно. Если используется оператор подписки, один из его операндов должен быть выражением целочисленной константы.

Мне кажется, что & array [5] является допустимым C ++, являющимся константным выражением адреса.

0 голосов
/ 12 июня 2009

Если ваш пример НЕ общий случай, а конкретный, то он разрешен. Вы можете легально , AFAIK, пройти один раз за выделенный блок памяти. Это не работает для общего случая, когда вы пытаетесь получить доступ к элементам дальше на 1 от конца массива.

Только что искали C-Faq: текст ссылки

...