Почему оператор [] не разрешен для карт, но разрешен для массивов int? - PullRequest
0 голосов
/ 02 сентября 2011

У меня есть класс со следующими личными членами:

 private:
  int *vals_;
  size_type *cidx_;
  std::map< size_type, std::pair<size_t, unsigned int> > ridx_;

Теперь я пытаюсь получить доступ к этим переменным в операторе << overload: (Обратите внимание, что <strong>m равно )

std::ostream& operator<<(std::ostream &os, const SMatrix &m) 
{
    os << m.cidx_[0] << endl;
    os << m.ridx_[0].first << endl;

  return os;
}

Я обнаружил, что m.cidx_ [0] будет работать, но m.ridx_ [0] .first выдает ошибку:

ошибка: передача 'const std :: map, std :: less, std :: allocator>>>' в качестве аргумента 'this' для оператора _Tp & std :: map <_Key, _Tp, _Compare, _Alloc> :: operator [] (const _Key &) [с _Key = без знака int, _Tp = std :: pair, _Compare = std :: less, _Alloc = std :: allocator>>] 'отбрасывает квалификаторы

Что, я считаю, означает, что operator [] является модифицирующим оператором и, следовательно, противоречит тому факту, что m является const. Но почему это работает для vals_ и cidx_, которые являются массивами типа int и size_type?

Ответы [ 2 ]

7 голосов
/ 02 сентября 2011

std::map::operator[] вставляет элемент, если он не существует, поэтому его нельзя использовать с const объектами. Массивы не являются типами классов в C ++, для них a[idx] эквивалентно *(a + idx) и никогда не изменяет сам массив.

1 голос
/ 02 сентября 2011

если вы просматриваете исходный код контейнера карты, нет map :: operator [] с квалификатором const cv, но ваш матричный объект const

...