C++でのイテレータの参照

C++イテレータを関数の引数として渡すときに参照渡しをすることにしたが, const参照を渡した場合にイテレータが指している値を変更可能なのかどうか確認してみた.

#include <iostream>
#include <vector>

int main()
{
  std::vector<int> vec = {0, 0, 0, 0, 0};
  std::cout << "vec: ";
  for (auto i: vec) std::cout << i << " ";
  std::cout << std::endl;

  // std::vector<int>::const_iterator const_itr(vec.begin() + 2); //エラー: assignment of read-only location
  // const std::vector<int>::iterator itr(vec.begin() + 2); // OK
  std::vector<int>::iterator itr(vec.begin() + 2);
  const std::vector<int>::iterator& itr_const_ref(itr);
  (*itr_const_ref) = 5;

  std::cout << "vec: ";
  for (auto i: vec) std::cout << i << " ";
  std::cout << std::endl;
  return 0;
}

結果は以下のように無事値が変わっている.

vec: 0 0 0 0 0
vec: 0 0 5 0 0

要するにポインタを渡すときと同様にイテレータ自体を置き換えることはできないが, イテレータが指しているものを変更するのは問題ない. イテレータが指している対象を変更不可能にしたければやはりconst_iteratorをそもそも使う必要があるということだ.

さらに言えば, 参照でなくとも"const std::vector::iterator"も同様にイテレータの変更はできないが, 指している先を書き換えることはできる.