Как я узнал, можно написать следующий код:- это int [указатель на массив] в стандарте C++?
char *a = new char[50];
for (int i = 0; i < 50; ++i) {
i[a] = '5';
}
Он компилирует. Оно работает. Это делает точно же, как
char *a = new char[50];
for (int i = 0; i < 50; ++i) {
a[i] = '5';
}
Является ли это просто потому, что:
a[b]
реализуется как макро*(a + b)
по умолчанию, и тот факт, что оба образца кода действительны только случайно/составитель специфический- он стандартизирован где-то, и результаты таких алгоритмов должны быть одинаковыми на с каждой платформа
Разумно предположить, что добавление должно быть коммутативным, но если мы реализуем operator[]
таким образом, мы сделали что-то еще коммутативное, чего бы мы не хотели.
Интересным фактом является то, что нет оператора pointer[pointer]
, поэтому operator[]
не является макросом.
Я знаю, что это плохо. Я знаю, что это путает людей, которые читают код. Но я хочу знать, если это просто несчастный случай, и он не будет работать на далекой земле, где у единорогов семь ножек и рогов на левой щеке.
Это не ** макрос, это правило языка. – stefan
Я удалил тег C, так как это кажется скорее C++-сфокусированным. – unwind
_'Но я хочу знать, если это просто несчастный случай, и он не будет работать в далекой стране, где у единорогов есть семь ног, а рожки - на их левой щеке. '' Вряд ли, потому что стандарт определяет это поведение неявно. –