Скажем, у меня есть функция, называемая так:
void mysort(int *arr, std::size_t size)
{
std::sort(&arr[0], &arr[size]);
}
int main()
{
int a[] = { 42, 314 };
mysort(a, 2);
}
Мой вопрос: имеет ли код mysort
(точнее, &arr[size]
) поведение?
Я знаю, что это было бы совершенно верно, если заменить на arr + size
; Арифметика указателя позволяет указывать в конце концов. Однако мой вопрос касается использования &
и []
.
Per С++ 11 5.2.1/1, arr[size]
эквивалентно *(arr + size)
.
Цитата 5.3.1/1, правила для унарного *
:
Унарный оператор
*
выполняет косвенное обращение: выражение, к которому оно применяется, должно быть указателем для тип объекта или указатель на тип функции, а результат - это lvalue, относящийся к объекту или функции , на которое указывает выражение. Если тип выражения является "указателем наT
", то тип результата будет "T
". [Примечание: указатель на неполный тип (кроме cvvoid
) может быть разыменован. Полученная таким образом lvalue может использоваться ограниченным образом (например, для инициализации ссылки); это значение не должно быть преобразовано в prvalue, см. 4.1. -end note]
Наконец, 5.3.1/3, дающий правила для &
:
Результат унарного оператора
&
является указателем на его операнд. Операнд должен быть lvalue... если тип выражениеT
, результат имеет тип "указатель наT
" и является prvalue, который является адресом указанного объекта (1.7) или указателем на назначенную функцию.
(Акцент и эллипсы мои).
Я не могу решить об этом. Я точно знаю, что преобразование lvalue-to-rvalue на arr[size]
будет Undefined. Но такое преобразование не происходит в коде. arr + size
не указывает на объект; но в то время как вышеприведенные параграфы говорят об объектах, они, похоже, явно не указывают на необходимость существования объекта в этом месте (в отличие от преобразования lvalue-to-rvalue в 4.1/1).
Итак, questio: есть mysort
, как он называется, действителен или нет?
(Обратите внимание, что я цитирую С++ 11 выше, но если это будет рассмотрено более подробно в более позднем стандарте/черновике, я был бы в восторге от этого).