Какой тип C++ ожидает для индексов массива?
В С, массив подписки: a[b]
это просто синтаксический сахарный эквивалент разыменования после арифметики указателя: *(a+b)
(как объяснили, скажем, здесь).
Как интерпретируется подписка на массив в C++ для базовых типов? (Не для классов, для которых у нас есть семантика перегрузки)? И, более конкретно, какой тип C++ ожидает, чтобы появиться как индекс? Это ptrdiff_t
?
2 ответа
С ++ точно такой же, как С в этом отношении. C++11 §5.2.1:
Выражение
E1[E2]
идентичен (по определению)*((E1)+(E2))
Как интерпретируется подписка на массив в C++,
В C++ E1[E2]
идентично *((E1)+(E2))
какой тип C++ ожидает, чтобы появиться как индекс?
C++ ожидает перечисления с незаданной областью или целочисленного типа, оба элемента рассматриваются в разделе стандарта C++. 5.2.1
Подписывая параграф 1, который говорит (выделение мое):
Выражение постфикса, за которым следует выражение в квадратных скобках, является выражением постфикса. Одно из выражений должно иметь тип "указатель на T", а другое - перечисление с незаданной областью или целочисленный тип. Результатом является lvalue типа "T". Тип "T" должен быть полностью определенным типом объекта. 62 Выражение E1[E2] идентично (по определению) значению * ((E1) + (E2)) [Примечание: подробности о * и + и 8.3.4 см. В подробностях о массивах * и + и 8.3.4. —Конечная записка]
Как указывает Джеймс, формулировка " Одно из выражений" позволяет взаимозаменять указатель и нижний индекс, например:
#include <iostream>
int main()
{
int arr[5] = {1, 2, 3, 4, 5 } ;
std::cout << arr[2] << ":" << 2[arr] << std::endl ;
}
Использование альтернативного синтаксиса 2[arr]
не рекомендуется, большинство людей не будут знать, что это делает, это делает код менее читаемым и, следовательно, менее понятным.
что аналогично соответствующему разделу в проекте стандарта C99 6.5.2.1
Массив подписывающий параграф 2 который гласит (выделено мое):
Выражение постфикса, за которым следует выражение в квадратных скобках [], является подписанным обозначением элемента объекта массива. Определение оператора индекса [] заключается в том, что E1[E2] идентичен (* ((E1) + (E2))). Из-за правил преобразования, которые применяются к бинарному оператору +, если E1 является объектом массива (эквивалентно указателю на начальный элемент объекта массива), а E2 является целым числом, E1[E2] обозначает E2-й элемент Е1 (считая с нуля).