Подтвердить что ты не робот

Почему нет → [] оператора в С++? (индексный оператор для разыменованных указателей массива)

Я знаю, спрашиваю, почему? это плохой вопрос для этого сайта, поскольку мы не можем знать. Однако я имею в виду это как разговорную замену для запроса, каковы возможные причины?

Я обнаружил, что пишу, естественно,

foo->[i];

и удивлен, узнав, что это не сработало. Я хотел написать:

(*foo)[i];

Я уверен, что больше всего вижу, что я имею в виду, но чтобы быть ясным, я думал, что

bar.subscript(i);
foo->subscript(i);

будет аналогично

bar.operator[](i);
foo->operator[](i);

Но это, похоже, не так. Почему? Я уверен, что я должен смотреть на что-то не так, но я не могу понять, что. Я знаю очень мало теории, поэтому было бы оценено объяснение мирянина.

Если в моей аналогии нет очевидной ошибки, то каковы возможные причины, по которым разработчики языка могли покинуть оператор? Является ли это неоднозначным? (Если это так, как ошибочное для чего?)


Я хотел бы внести некоторые комментарии в редактирование в соответствии с рекомендацией @chris, поскольку я не был так ясен, как должен был быть:

OP предлагает оператор → [], комбинацию из двух.
- chris
Он спрашивает, почему то, чего он хочет, не существует, а не почему код, который он пытается написать, не работает.
- Matthew 'Cogwheel' Orlando
4b9b3361

Ответ 1

Каковы возможные причины, по которым разработчики языка могли покинуть оператор?

1: Никто не предлагал это. Если он не предлагается, он не входит в язык.

2: Это выглядит неправильно. operator-> может возвращать указатель, но использование его в языке "ссылается на этот указатель и получает доступ к элементу". То, что язык будет делать с ->. Поэтому, когда кто-то видит ->[], он выглядит некорректно. Вещью справа от -> в каждом другом случае является некоторая форма идентификатора участника.

3: Потому что есть гораздо более важные вещи, связанные с языком, чем изменение чего-то вроде этого.

Ответ 2

Право оператора должно быть именем члена. Явный operatorXYZ считается как имя члена, которого я предполагаю, поэтому допускается foo- > operator []. Однако случайный токен, такой как [], не считается именем члена, поэтому foo → [i] не разрешено.

Ответ 3

Я предполагаю, что причина в том, что в С++ существует значительная вероятность использования vector (или array в С++ 1) вместо массивов указателей на C. В С++-ориентированных решениях нет необходимости в таком операторе, поэтому он, вероятно, считался дополнительной работой для компилятора, при этом предоставляя мало пользы.

Если вам нужен 2d-массив, то foo[0][i] уже работает с C-массивами.