Почему нет → [] оператора в С++? (индексный оператор для разыменованных указателей массива)
Я знаю, спрашиваю, почему? это плохой вопрос для этого сайта, поскольку мы не можем знать. Однако я имею в виду это как разговорную замену для запроса, каковы возможные причины?
Я обнаружил, что пишу, естественно,
foo->[i];
и удивлен, узнав, что это не сработало. Я хотел написать:
(*foo)[i];
Я уверен, что больше всего вижу, что я имею в виду, но чтобы быть ясным, я думал, что
bar.subscript(i);
foo->subscript(i);
будет аналогично
bar.operator[](i);
foo->operator[](i);
Но это, похоже, не так. Почему? Я уверен, что я должен смотреть на что-то не так, но я не могу понять, что. Я знаю очень мало теории, поэтому было бы оценено объяснение мирянина.
Если в моей аналогии нет очевидной ошибки, то каковы возможные причины, по которым разработчики языка могли покинуть оператор? Является ли это неоднозначным? (Если это так, как ошибочное для чего?)
Я хотел бы внести некоторые комментарии в редактирование в соответствии с рекомендацией @chris, поскольку я не был так ясен, как должен был быть:
OP предлагает оператор → [], комбинацию из двух.
- chris
Он спрашивает, почему то, чего он хочет, не существует, а не почему код, который он пытается написать, не работает.
- Matthew 'Cogwheel' Orlando
Ответы
Ответ 1
Каковы возможные причины, по которым разработчики языка могли покинуть оператор?
1: Никто не предлагал это. Если он не предлагается, он не входит в язык.
2: Это выглядит неправильно. operator->
может возвращать указатель, но использование его в языке "ссылается на этот указатель и получает доступ к элементу". То, что язык будет делать с ->
. Поэтому, когда кто-то видит ->[]
, он выглядит некорректно. Вещью справа от ->
в каждом другом случае является некоторая форма идентификатора участника.
3: Потому что есть гораздо более важные вещи, связанные с языком, чем изменение чего-то вроде этого.
Ответ 2
Право оператора → должно быть именем члена. Явный operatorXYZ считается как имя члена, которого я предполагаю, поэтому допускается foo- > operator []. Однако случайный токен, такой как [], не считается именем члена, поэтому foo → [i] не разрешено.
Ответ 3
Я предполагаю, что причина в том, что в С++ существует значительная вероятность использования vector
(или array
в С++ 1) вместо массивов указателей на C. В С++-ориентированных решениях нет необходимости в таком операторе, поэтому он, вероятно, считался дополнительной работой для компилятора, при этом предоставляя мало пользы.
Если вам нужен 2d-массив, то foo[0][i]
уже работает с C-массивами.