Какой тип 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 (считая с нуля).

Другие вопросы по тегам