2009-11-12 4 views
1

В C++, почему следующий элемент доступа в vector недействителен?Почему этот синтаксис недействителен? vectorPointer -> [0]

void foo(std::vector<int>* vecPtr) { 
    int n = vecPtr->size(); // ok 
    int a = vecPtr->[0]; // invalid 
} 

Вместо этого мы должны написать более громоздкой

(*vecPtr)[0] = 1; 

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

+1

Не ответ, но почему вы передаете указатель на вектор вместо передачи по ссылке? Это упростит использование функции в то же время, когда вы четко укажете, что код вызывающего абонента отвечает за время жизни вектора. –

ответ

12

Это потому, что язык ожидает появления члена после ->. Так формулируется язык. Вы можете использовать синтаксис вызова функции, если вы хотите

// not really nicer 
vecPtr->operator[](0); 

Если вам нужно сделать, это много в последовательности, используя [0] вместо скобок может улучшить читаемость значительно

vecPtr[0][0] 

В противном случае, для одного уровня я нахожу (*vecPtr)[0] для меня совершенно понятным.

+7

+1 Кроме того, вы можете назначить вектор ссылки, и это он! – AraK

+0

Но оператор [] является членом. – Frank

+0

Хорошая работа над «оператором как вызов метода» ... Вы избили меня до этого :) +1 – jheddings

0

Вы, кажется, уже знаете, что это должно быть недопустимым синтаксисом, так что в чем вопрос ? Единственный ответ, как написано, - «потому что так написано язык».

Семантически это потому, что оператор [] по существу говорит «вычислять смещение от поставленного адреса»; это не метод, это оператор. Синтаксис, который вы даете, просто не похож на его смысл.

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

Рассмотрите возможность использования ссылок, если вы хотите быть более точными относительно своей косвенности (сбой символа).

+1

Это метод на std :: vector –

+1

Нет, это метод, если вы пишете его как метод. Как написано, это оператор (перегруженный, но оператор тем не менее). – phoebus

5

В дополнение к litb's nice answer я должен сказать, что есть функция at в vector класса, который позволяет использовать его следующим образом:

int a = vecPtr->at(0); 

Отличие этой функции член и член функции оператора operator[] что vector::at если запрошенная позиция выходит за допустимые пределы, выбрасывая исключение out_of_range.

Смежные вопросы