языки программирования — Почему бы не & gt; [] оператор в C ++? (оператор нижнего индекса для указателей на разыменованный массив)

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

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

foo->[i];

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

(*foo)[i];

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

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

было бы аналогично

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

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

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


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

ОП предлагает оператор -> [], комбинацию двух.
— Крис

Он спрашивает, почему то, что он хочет, не существует, а не то, почему код, который он пытается написать, не работает.
— Мэтью ‘Зубчатая’ Орландо

13

Решение

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

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

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

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

3

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

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

4

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

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

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