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