2016-12-07 7 views
0

Согласно cplusplus.com, std::vector::operator[] имеет два перегруженные:Почему у нас есть отдельные функции, возвращающие const и non-const?

 reference operator[] (size_type n); 
const_reference operator[] (size_type n) const; 

Почему нам нужна версия функции const? Или, Почему бы нам просто не написать одну функцию non-const?

Например, в следующем коде:

std::vector<int> a = {1, 2, 3, 4, 5}; 
int b = a[1] + a[3]; // Why does it matter if this is const? 
+1

Нет, они оба возвращают lvalues ​​... – Brian

+0

@Brian Если у вас есть класс 'a' с функцией' const int & getInt() const', не будет ли 'a.getInt() = 5' незаконным? С другой стороны, если бы он вернул неконстантную ссылку, разве это не было бы законным? – dma1324

ответ

5

const перегрузки будет вызываться, когда сам объект объявлен const. Например, если мы только имели неконстантную перегрузку operator[] на std::vector, следующий код будет отказаться от компиляции:

const std::vector<int> a{10, 20, 30}; 
int y = a[0]; 

С другой стороны, если мы не имеем неконстантные перегрузок, после потерпит неудачу:

std::vector<int> a{10, 20, 30}; 
a[0] = 15; 

И последнее, но не менее, ни одна из этих функций не возвращают rvalue. Оба возвращают lvalue.

+0

Прошу прощения, если мне не хватает чего-то глупого, но почему первый фрагмент не может просто вызвать неконстантную перегрузку? – dma1324

+2

@ dma1324, потому что C++ является строго типизированным языком, а 'const' является частью типа. Неконстантный тип при необходимости будет распадаться на const, но не наоборот. –

0

Версия const существует для разрешения доступа элемента (только для чтения) постоянного вектора. Без него вектор const будет WOM.

Функция возвращает ссылку const, что означает, что вы не можете присвоить ей новое значение, но вы можете скопировать ее в другом месте (если она скопирована).

0

Ну ссылка возвращение версия позволяет изменять вектор с помощью брекет обозначения:

a[1] = -1; 

Поскольку объект на левой стороне является ссылкой на запись в векторе, это фактически изменяет вектор ,

Версия, возвращающая const_reference, позволяет получить доступ к элементам вектора const.

const vector<int> a {1, 3}; 
int x = a[0]; 

Это не будет компилироваться без перегрузки const_reference.