今日の教訓

STL コンテナ の反復子をconst 関数内で使うときは const_iterator にしなければいけない.

void A::func() const {
  std::vector<int>::iterator iter(my_vector.begin());       // エラー
  std::vector<int>::const_iterator citer(my_vector.begin()); // OK
  ...
}

恥ずかしながら const_iterator の存在を知らず,頑張って iterator を使おうとしてて,一時間弱はまってしまった.ちょうどテンプレートを多用している関数でのエラーだったのでエラーメッセージがすごいことになっていて,ただ const 性が守られていないだけなのことに全然気づかなかった.反省...
というか驚きなのは,vector はコンテキストを判断して const_iterator を返そうとしていたっぽい.それを iterator にコピーしようとしていて,それがエラーになっていたように見えたのだけれど,自分の勘違いだろうか.どうして,同じ begin() 関数なのに,そこで使える反復子が const_iterator だと判断できていたんだ?何かトリックがあるのか.

追記

単純に const 性の有無でオーバーロードしているだけですね.というか,それだけでオーバーロードできるということを知らなかった.恥ずかしい.

#include <stdio.h>

class Object {
 public:
  void check() { puts("I am not const."); }
  void check() const { puts("I am const."); }
};

int main(int argc, char** argv) {
  Object obj;
  const Object& cobj = obj;
  obj.check();
  cobj.check();
}
$ g++ const.cc
$ ./a.out
I am not const.
I am const.