Какой тип C ++ ожидает для индексов массива?

В С, массив подписки: a[b] это просто синтаксический сахарный эквивалент разыменования после арифметики указателя: *(a+b) (как объяснили, скажем, Вот).

Как интерпретируется подписка на массив в C ++ для базовых типов? (Не для классов, для которых у нас есть семантика перегрузки)? И, более конкретно, какой тип C ++ ожидает, чтобы появиться как индекс? Это ptrdiff_t?

3

Решение

С ++ точно такой же, как С в этом отношении. C ++ 11 §5.2.1:

Выражение E1[E2] идентичен (по определению) *((E1)+(E2))

3

Другие решения

Как интерпретируется подписка на массив в C ++,

В C ++ E1[E2] является идентичный в *((E1)+(E2))

какой тип C ++ ожидает, чтобы появиться как индекс?

C ++ ожидает перечисление с незаданной областью или целочисленный тип оба пункта рассматриваются в проект стандарта C ++ раздел 5.2.1 индексация параграф 1 который говорит (акцент мой):

Постфиксное выражение, за которым следует выражение в квадратных скобках, является постфиксным выражением. Одно из выражений должно иметь тип «указатель на T» и другой должен иметь перечисление с незаданной областью или целочисленный тип. Результатом является lvalue типа «T». Тип «T» должен быть полностью определенным типом объекта.62 выражение E1 [E2] идентично (по определению) выражению * ((E1) + (E2)) [Примечание: см. 5.3 и 5.7 для деталей * и + и 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-й
элемент E1 (считая с нуля).

6

По вопросам рекламы [email protected]